├── .gitignore ├── .idea ├── libraries │ └── lib.xml └── uiDesigner.xml ├── README.md ├── bin ├── java.sh └── setjavavars.sh ├── build.properties ├── build.xml ├── conf └── log4j.properties ├── data ├── syllable.en └── syllable.vn ├── init.sh ├── lib ├── annotations.jar ├── fastutil-6.4.3.jar ├── gson-2.2.4.jar ├── guava-14.0.1.jar ├── joda-time-1.6.jar ├── junit-4.8.2.jar ├── log4j-1.2.16.jar ├── object-explorer.jar ├── opencsv-3.5.jar ├── slf4j-api-1.6.4.jar ├── slf4j-log4j12-1.6.4.jar ├── snappy-0.3.jar └── snappy-java-1.0.4.1.jar ├── libsrc ├── commons-io-2.4-sources.jar ├── fastutil-6.4.3-sources.jar ├── guava-12.0-sources.jar ├── snappy-0.3-sources.jar └── weka-3.8.0-src.jar └── src ├── hadoop_seqio.patch ├── java ├── de │ └── FastUtilExample.java ├── tool │ └── tooling │ │ ├── AnnotationParser.java │ │ ├── Arg.java │ │ ├── ArgInfo.java │ │ ├── Argument.java │ │ ├── CommandLineParser.java │ │ ├── CommandLineParsingException.java │ │ ├── ConfigurationException.java │ │ ├── DateMapper.java │ │ ├── DefaultTypeMapper.java │ │ ├── DefaultValue.java │ │ ├── PortNumberMapper.java │ │ ├── Runner.java │ │ ├── Tool.java │ │ ├── ToolInfo.java │ │ ├── ToolingException.java │ │ ├── TypeMapper.java │ │ └── TypeMappingException.java └── utils │ ├── DateTimeUtils.java │ ├── FileUtils.java │ ├── JsonUtils.java │ ├── RandomUtils.java │ ├── RuntimeUtils.java │ ├── StringUtils.java │ ├── TimestampUtils.java │ └── Utils.java ├── pom.xml └── src.eml /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/* 2 | *.class 3 | *.iml 4 | *.out 5 | *.gc 6 | /out/* 7 | *.DS_Store 8 | /eee 9 | /alldata/* 10 | /build/* 11 | /src/java-gen/* 12 | /*.log 13 | /*.iml 14 | /*.eml 15 | /logs/* 16 | -------------------------------------------------------------------------------- /.idea/libraries/lib.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/uiDesigner.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # data_engineering 2 | 3 | Đây là dự án thực hành các vấn đề thực tế của [BeeCost.Com](https://www.beecost.com) khi làm Data Engineering trên dữ liệu lớn của các trang web E-Commerce. 4 | 5 | Bạn có thể thoải mái sử dụng hay chia sẻ tài nguyên tại project này, trừ các hình ảnh thuộc về thương hiệu của BeeCost. 6 | 7 | BeeCost Team cũng rất mong các nhận xét và đóng góp từ các bạn. Đây là các thông tin bạn sẽ cần tìm hiểu thêm: 8 | 9 | ## 1. [Các phần mềm cần thiết](https://github.com/beecost/data_engineering/wiki#c%C3%A1c-ph%E1%BA%A7n-m%E1%BB%81m-c%E1%BA%A7n-thi%E1%BA%BFt-cho-project-n%C3%A0y) 10 | 11 | ## 2. [Cách Download project về máy](https://github.com/beecost/data_engineering/wiki#download-code-project-v%E1%BB%81-m%C3%A1y-c%E1%BB%A7a-b%E1%BA%A1n) 12 | 13 | ## 3. [Cách Build code](https://github.com/beecost/data_engineering/wiki#code-build) 14 | 15 | ## 4. [Wiki và các bài thực hành](https://github.com/beecost/data_engineering/wiki) 16 | 17 | Project code này là một câu chuyện dài 05 năm từ khi chúng mình khởi nghiệp. BeeCost là một team đam mê khoa học dữ liệu (Data Science). 18 | 19 | Thành viên team mình từng thắng Nhân Tài Đất Việt 2017 cho sản phẩm **Chống đạo văn sử dụng AI** đang được sử dụng tại các trường đại học. Một thành viên khác là Data Scientist 12 năm kinh nghiệm, là lớp kĩ sư nòng cốt đầu tiên của [Cốc Cốc Search](https://coccoc.com/search), từng bán được 2 công ty dữ liệu và AI, tác giả của ChatBot ngân hàng MBBank và ví điện tử BUNO của BIDV Bank. 20 | 21 | Trước khi đến với BeeCost, chúng mình là đồng sáng lập mạng xã hội Phật tử [butta.vn](https://www.butta.vn) cùng Giáo Hội Phật Giáo Việt Nam, ra mắt tại Vesak 2019: sự kiện của Liên Hợp Quốc với hơn 20 nước tham gia. 22 | 23 | Những gì chúng mình làm là dùng công nghệ và dữ liệu để phục vụ người dùng internet, [BeeCost.Com](https://www.beecost.com/install?utm_source=github&utm_medium=readme&pub=data_engineering_blog) cũng không phải là ngoại lệ, nó là một trợ lý mua sắm Online, mang tinh hoa của team mình từ các dự án đã làm. 24 | 25 | **Và, project mở này là những phần cốt lõi đầu tiên nhất đã xây dựng nên [BeeCost](https://www.beecost.com/install?utm_source=github&utm_medium=readme&pub=data_engineering_blog).** 26 | 27 | Bạn có thể thử dùng để thấy những dòng code đã tạo nên [BeeCost.Com](https://www.beecost.com/install?utm_source=github&utm_medium=readme&pub=data_engineering_blog) như thế nào nha. 28 | -------------------------------------------------------------------------------- /bin/java.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Wrapper for java console command. You can use several environment variables to alter JVM options. 4 | # 5 | # Heap size is 1 Gb. 6 | # Set JAVA_MEM to change the default heap size (e.g. "2g", "2048m") 7 | # No GC options are set. 8 | # Set JAVA_GC_OPTIONS to provide your options, or 9 | # set JAVA_GC to CMS, SER, PAR or PAROLD to quickly set the desired GC type. 10 | # Java GC logging is enabled, 'logs/.gc' is the log faile. 11 | # Set JAVA_DISABLE_GC_LOG to disable it, or 12 | # set JAVA_GC_LOG_OPTIONS to override default options; or 13 | # set JAVA_GC_LOG_FILE to change the default log file. 14 | # Yourkit profiler agent is disabled. 15 | # Set JAVA_ENABLE_YOURKIT to enable it; 16 | # set JAVA_YOURKIT_AGENT_PATH to change the default path to the agent library. 17 | # Remote debugging is disabled. 18 | # Set JAVA_ENABLE_REMOTE_DEBUG to enable it (default port is 1044), or 19 | # set JAVA_REMOTE_DEBUG_OPTIONS to override default options; 20 | # set JAVA_REMOTE_DEBUG_PORT to change the default port, 21 | # set JAVA_REMOTE_DEBUG_SUSPEND to "y" to suspend the program until a debugger is attached. 22 | # Compress object reference size is enable 23 | # in 64bits OS, remove JAVA_COMPRESS_REF_OPTIONS to use default (64 bits) object reference size 24 | # Log4j configuration file is 'log4j.properties' placed in CLASSPATH. 25 | # Set LOG4J_CONFIG to change the default path. 26 | # Additional JVM options can be set in JAVA_OPTIONS variable. 27 | 28 | if [ $# = 0 ]; then 29 | echo "Usage: $0 " >&2 30 | exit 1 31 | fi 32 | CLASS=$1 33 | shift 34 | 35 | # we start with user provided JAVA_OPTIONS. it contains additional JVM options 36 | 37 | # heap size 38 | if [ -z $JAVA_MEM ]; then 39 | JAVA_MEM="1g" 40 | fi 41 | JAVA_OPTIONS="$JAVA_OPTIONS -Xms$JAVA_MEM -Xmx$JAVA_MEM -server -Dfile.encoding=UTF8" 42 | 43 | # compressed size of an object reference, use this when heap size <= 32GB 44 | #JAVA_COMPRESS_REF_OPTIONS="-XX:+UseCompressedOops" 45 | if [ ! -z "$JAVA_COMPRESS_REF_OPTIONS" ]; then 46 | JAVA_OPTIONS="$JAVA_OPTIONS $JAVA_COMPRESS_REF_OPTIONS" 47 | echo "using compressed object references:$JAVA_COMPRESS_REF_OPTIONS" 48 | fi 49 | 50 | JAVA_GC_OPTIONS="-XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseParNewGC -XX:NewSize=64m -XX:MaxNewSize=64m -XX:SurvivorRatio=8 -XX:+PrintTenuringDistribution -XX:+CMSScavengeBeforeRemark -XX:+DisableExplicitGC -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled -XX:+UseTLAB -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -XX:+OptimizeStringConcat -XX:ParallelGCThreads=4 -XX:CMSInitiatingOccupancyFraction=95 -XX:+UseCMSInitiatingOccupancyOnly -XX:GCTimeRatio=19 -XX:MaxGCPauseMillis=1000 -XX:+NeverTenure" 51 | 52 | # GC options 53 | if [ -z "$JAVA_GC_OPTIONS" ]; then 54 | if [ "$JAVA_GC" == "CMS" ]; then 55 | JAVA_GC_OPTIONS="-XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseParNewGC" 56 | elif [ "$JAVA_GC" == "SER" ]; then 57 | JAVA_GC_OPTIONS="-XX:+UseSerialGC" 58 | elif [ "$JAVA_GC" == "PAR" ]; then 59 | JAVA_GC_OPTIONS="-XX:+UseParallelGC" 60 | elif [ "$JAVA_GC" == "PAROLD" ]; then 61 | JAVA_GC_OPTIONS="-XX:+UseParallelOldGC" 62 | elif [ -z "$JAVA_GC" ]; then 63 | JAVA_GC_OPTIONS= 64 | else 65 | echo "Unknown JAVA_GC option : $JAVA_GC" >&2 66 | exit 2 67 | fi 68 | fi 69 | JAVA_OPTIONS="$JAVA_OPTIONS $JAVA_GC_OPTIONS" 70 | 71 | # GC logging 72 | # other useful options: -XX:+PrintGCTimeStamps -XX:+PrintTenuringDistribution 73 | if [ -z "$JAVA_DISABLE_GC_LOG" ]; then 74 | if [ -z "$JAVA_GC_LOG_OPTIONS" ]; then 75 | if [ -z "$JAVA_GC_LOG_FILE" ]; then 76 | JAVA_GC_LOG_FILE="logs/$$.gc" 77 | fi 78 | JAVA_GC_LOG_OPTIONS="-verbose:gc -Xloggc:$JAVA_GC_LOG_FILE -XX:+PrintGCDetails" 79 | fi 80 | JAVA_OPTIONS="$JAVA_OPTIONS $JAVA_GC_LOG_OPTIONS" 81 | fi 82 | 83 | # remote debugging 84 | if [ ! -z $JAVA_ENABLE_REMOTE_DEBUG ] || [ ! -z $JAVA_REMOTE_DEBUG_OPTIONS ]; then 85 | if [ -z $JAVA_REMOTE_DEBUG_OPTIONS ]; then 86 | if [ -z $JAVA_REMOTE_DEBUG_PORT ]; then 87 | JAVA_REMOTE_DEBUG_PORT="1044" 88 | fi 89 | if [ -z $JAVA_REMOTE_DEBUG_SUSPEND ]; then 90 | JAVA_REMOTE_DEBUG_SUSPEND="n" 91 | fi 92 | JAVA_REMOTE_DEBUG_OPTIONS="transport=dt_socket,server=y,suspend=$JAVA_REMOTE_DEBUG_SUSPEND,address=$JAVA_REMOTE_DEBUG_PORT" 93 | fi 94 | JAVA_OPTIONS="$JAVA_OPTIONS -Xdebug -Xrunjdwp:$JAVA_REMOTE_DEBUG_OPTIONS" 95 | fi 96 | 97 | # log4j coinfiguration 98 | if [ ! -z "$LOG4J_CONFIG" ]; then 99 | JAVA_OPTIONS="$JAVA_OPTIONS -Dlog4j.configuration=$LOG4J_CONFIG" 100 | fi 101 | 102 | # sets CLASSPATH, JAVA_HOME, JAVA; updates JAVA_OPTIONS 103 | . bin/setjavavars.sh 104 | export CLASSPATH 105 | export JAVA_HOME 106 | # gogogo 107 | exec $JAVA $JAVA_OPTIONS $CLASS "$@" 108 | -------------------------------------------------------------------------------- /bin/setjavavars.sh: -------------------------------------------------------------------------------- 1 | CLASSPATH= 2 | 3 | CLASSPATH=${PWD}/conf:${CLASSPATH} 4 | 5 | if [ -d ${PWD}/build/classes ]; then 6 | CLASSPATH=${CLASSPATH}:${PWD}/build/classes; 7 | fi 8 | 9 | if [ -d ${PWD}/build ]; then 10 | for f in ${PWD}/build/*.jar; do 11 | CLASSPATH=${CLASSPATH}:$f; 12 | done 13 | fi 14 | 15 | if [ -d ${PWD}/lib ]; then 16 | for f in ${PWD}/lib/*.jar; do 17 | CLASSPATH=${CLASSPATH}:$f; 18 | done 19 | fi 20 | 21 | if [ "$JAVA_HOME" = "" ]; then 22 | JAVA_HOME=`readlink -f \`which java\` | sed "s/^\(.*\)\/bin\/java/\\1/"` 23 | JAVA=$JAVA_HOME/bin/java 24 | if [ ! -x $JAVA_HOME/bin/java ]; then 25 | echo "Error: No suitable jvm found. Using default one." > /dev/stderr 26 | JAVA_HOME="" 27 | JAVA=java 28 | fi 29 | else 30 | JAVA=$JAVA_HOME/bin/java 31 | fi 32 | 33 | -------------------------------------------------------------------------------- /build.properties: -------------------------------------------------------------------------------- 1 | project.name = data_engineering 2 | 3 | # projects's root 4 | base.dir = ${basedir} 5 | # root of main java sources 6 | src.java.dir = ${base.dir}/src/java 7 | # root of java tests 8 | src.java.dir.tests = ${base.dir}/test 9 | # directory for auto generated java sources 10 | src.java-gen.dir = ${base.dir}/src/java-gen 11 | # directory for build output 12 | build.dir = ${base.dir}/build 13 | build.classes.dir = ${build.dir}/classes 14 | 15 | # directory with jar libraries 16 | lib.dir = ${base.dir}/lib 17 | conf.dir = ${base.dir}/conf 18 | javadoc.build.dir = ${build.dir}/javadoc 19 | 20 | build.encoding = utf-8 21 | 22 | # compiler defines 23 | javac.debug=on 24 | javac.optimize=on 25 | javac.deprecation=off 26 | javac.version= 1.8 27 | -------------------------------------------------------------------------------- /build.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /conf/log4j.properties: -------------------------------------------------------------------------------- 1 | log4j.rootLogger=INFO,stderr 2 | 3 | log4j.logger.org.hibernate=FATAL 4 | log4j.logger.org.apache.hadoop=FATAL 5 | log4j.logger.org.eclipse.jetty=INFO 6 | log4j.logger.org.apache.mina=INFO 7 | log4j.logger.org.apache.commons.httpclient=INFO 8 | log4j.logger.httpclient.wire=INFO 9 | 10 | log4j.threshhold=ALL 11 | 12 | log4j.appender.stderr=org.apache.log4j.ConsoleAppender 13 | log4j.appender.stderr.Target=System.err 14 | log4j.appender.stderr.layout=org.apache.log4j.PatternLayout 15 | log4j.appender.stderr.layout.ConversionPattern=%d [%t] %-5p %c - %m%n 16 | 17 | log4j.logger.org.apache.commons.httpclient.HttpMethodBase=ERROR 18 | -------------------------------------------------------------------------------- /data/syllable.vn: -------------------------------------------------------------------------------- 1 | a 2 | ai 3 | am 4 | an 5 | ang 6 | anh 7 | ao 8 | au 9 | ba 10 | bai 11 | ban 12 | bang 13 | banh 14 | bao 15 | bay 16 | be 17 | ben 18 | beng 19 | beo 20 | bi 21 | bia 22 | bin 23 | binh 24 | biên 25 | biếc 26 | biếm 27 | biến 28 | biếng 29 | biết 30 | biếu 31 | biền 32 | biển 33 | biểu 34 | biện 35 | biệt 36 | bo 37 | boa 38 | bom 39 | bon 40 | bong 41 | boong 42 | bu 43 | bua 44 | bung 45 | buôn 46 | buông 47 | buýt 48 | buốt 49 | buồi 50 | buồm 51 | buồn 52 | buồng 53 | buổi 54 | buộc 55 | buột 56 | bà 57 | bài 58 | bàn 59 | bàng 60 | bành 61 | bào 62 | bàu 63 | bày 64 | bá 65 | bác 66 | bách 67 | bái 68 | bám 69 | bán 70 | báng 71 | bánh 72 | báo 73 | bát 74 | báu 75 | bân 76 | bâng 77 | bâu 78 | bây 79 | bã 80 | bãi 81 | bão 82 | bè 83 | bèm 84 | bèn 85 | bèo 86 | bé 87 | béc 88 | bén 89 | béng 90 | béo 91 | bép 92 | bét 93 | bê 94 | bên 95 | bênh 96 | bêu 97 | bì 98 | bìa 99 | bìm 100 | bình 101 | bìu 102 | bí 103 | bích 104 | bím 105 | bính 106 | bíp 107 | bít 108 | bíu 109 | bò 110 | bòn 111 | bòng 112 | bó 113 | bóc 114 | bói 115 | bón 116 | bóng 117 | bóp 118 | bót 119 | bô 120 | bôi 121 | bôm 122 | bôn 123 | bông 124 | bõ 125 | bõm 126 | bõng 127 | bù 128 | bùa 129 | bùi 130 | bùm 131 | bùn 132 | bùng 133 | bú 134 | búa 135 | búi 136 | bún 137 | búng 138 | búp 139 | bút 140 | băm 141 | băn 142 | băng 143 | bĩ 144 | bĩnh 145 | bĩu 146 | bơ 147 | bơi 148 | bơm 149 | bơn 150 | bưng 151 | bưu 152 | bươi 153 | bươm 154 | bươn 155 | bươu 156 | bước 157 | bướm 158 | bướng 159 | bướu 160 | bưởi 161 | bạ 162 | bạc 163 | bạch 164 | bại 165 | bạn 166 | bạnh 167 | bạo 168 | bạt 169 | bả 170 | bải 171 | bản 172 | bảng 173 | bảnh 174 | bảo 175 | bảy 176 | bấc 177 | bấm 178 | bấn 179 | bấp 180 | bất 181 | bấu 182 | bấy 183 | bầm 184 | bần 185 | bầu 186 | bầy 187 | bẩm 188 | bẩn 189 | bẩu 190 | bẩy 191 | bẫm 192 | bẫy 193 | bậc 194 | bậm 195 | bận 196 | bập 197 | bật 198 | bậu 199 | bậy 200 | bắc 201 | bắn 202 | bắng 203 | bắp 204 | bắt 205 | bằm 206 | bằng 207 | bẳn 208 | bẵm 209 | bẵng 210 | bặm 211 | bặt 212 | bẹ 213 | bẹc 214 | bẹn 215 | bẹo 216 | bẹp 217 | bẹt 218 | bẻ 219 | bẻm 220 | bẻo 221 | bẽ 222 | bẽn 223 | bẽo 224 | bế 225 | bến 226 | bếp 227 | bết 228 | bề 229 | bền 230 | bềnh 231 | bều 232 | bể 233 | bệ 234 | bệch 235 | bện 236 | bệnh 237 | bệt 238 | bỉ 239 | bỉnh 240 | bỉu 241 | bị 242 | bịa 243 | bịch 244 | bịn 245 | bịnh 246 | bịp 247 | bịt 248 | bịu 249 | bọ 250 | bọc 251 | bọn 252 | bọng 253 | bọt 254 | bỏ 255 | bỏi 256 | bỏm 257 | bỏng 258 | bố 259 | bốc 260 | bối 261 | bốn 262 | bống 263 | bốp 264 | bốt 265 | bồ 266 | bồi 267 | bồm 268 | bồn 269 | bồng 270 | bổ 271 | bổi 272 | bổn 273 | bổng 274 | bỗ 275 | bỗng 276 | bộ 277 | bộc 278 | bội 279 | bộn 280 | bộng 281 | bộp 282 | bột 283 | bớ 284 | bới 285 | bớp 286 | bớt 287 | bờ 288 | bời 289 | bờm 290 | bở 291 | bởi 292 | bỡ 293 | bỡn 294 | bợ 295 | bợm 296 | bợn 297 | bợp 298 | bợt 299 | bụ 300 | bụa 301 | bục 302 | bụi 303 | bụm 304 | bụng 305 | bụp 306 | bụt 307 | bủa 308 | bủn 309 | bủng 310 | bứa 311 | bức 312 | bứng 313 | bứt 314 | bừa 315 | bừng 316 | bửa 317 | bửng 318 | bửu 319 | bữa 320 | bự 321 | bựa 322 | bực 323 | bựng 324 | ca 325 | cai 326 | cam 327 | can 328 | cang 329 | canh 330 | cao 331 | cau 332 | cay 333 | cha 334 | chai 335 | chan 336 | chang 337 | chanh 338 | chao 339 | chau 340 | chay 341 | che 342 | chen 343 | cheng 344 | cheo 345 | chi 346 | chia 347 | chim 348 | chinh 349 | chiu 350 | chiêm 351 | chiên 352 | chiêng 353 | chiêu 354 | chiếc 355 | chiếm 356 | chiến 357 | chiếng 358 | chiết 359 | chiếu 360 | chiền 361 | chiềng 362 | chiều 363 | chiểu 364 | chiện 365 | cho 366 | choa 367 | choai 368 | choang 369 | choe 370 | choi 371 | chon 372 | chong 373 | choài 374 | choàng 375 | choác 376 | choán 377 | choáng 378 | choãi 379 | choèn 380 | choòng 381 | choạc 382 | choại 383 | choạng 384 | choảng 385 | choắt 386 | choẹt 387 | chu 388 | chua 389 | chui 390 | chum 391 | chun 392 | chung 393 | chuyên 394 | chuyến 395 | chuyền 396 | chuyển 397 | chuyện 398 | chuôi 399 | chuôm 400 | chuông 401 | chuẩn 402 | chuếnh 403 | chuệnh 404 | chuốc 405 | chuối 406 | chuốt 407 | chuồi 408 | chuồn 409 | chuồng 410 | chuỗi 411 | chuộc 412 | chuội 413 | chuộng 414 | chuột 415 | chà 416 | chài 417 | chàm 418 | chàng 419 | chành 420 | chào 421 | chày 422 | chá 423 | chác 424 | chách 425 | chái 426 | chán 427 | cháng 428 | chánh 429 | cháo 430 | chát 431 | cháu 432 | cháy 433 | châm 434 | chân 435 | châng 436 | châu 437 | chây 438 | chã 439 | chãi 440 | chão 441 | chè 442 | chèm 443 | chèn 444 | chèo 445 | ché 446 | chém 447 | chén 448 | chéo 449 | chép 450 | chét 451 | chê 452 | chêm 453 | chênh 454 | chì 455 | chìa 456 | chìm 457 | chình 458 | chí 459 | chích 460 | chím 461 | chín 462 | chính 463 | chít 464 | chíu 465 | chò 466 | chòe 467 | chòi 468 | chòm 469 | chòng 470 | chó 471 | chóa 472 | chóc 473 | chóe 474 | chói 475 | chóng 476 | chóp 477 | chót 478 | chôm 479 | chôn 480 | chông 481 | chõ 482 | chõng 483 | chù 484 | chùa 485 | chùi 486 | chùm 487 | chùn 488 | chùng 489 | chùy 490 | chú 491 | chúa 492 | chúc 493 | chúi 494 | chúm 495 | chúng 496 | chút 497 | chăm 498 | chăn 499 | chăng 500 | chĩa 501 | chĩnh 502 | chũi 503 | chũm 504 | chơ 505 | chơi 506 | chơm 507 | chơn 508 | chư 509 | chưa 510 | chưng 511 | chương 512 | chước 513 | chướng 514 | chườm 515 | chường 516 | chưởng 517 | chược 518 | chượp 519 | chạ 520 | chạc 521 | chạch 522 | chạm 523 | chạn 524 | chạng 525 | chạnh 526 | chạo 527 | chạp 528 | chạy 529 | chả 530 | chải 531 | chảo 532 | chảy 533 | chấm 534 | chấn 535 | chấp 536 | chất 537 | chấu 538 | chấy 539 | chầm 540 | chần 541 | chầu 542 | chầy 543 | chẩm 544 | chẩn 545 | chẫm 546 | chậc 547 | chậm 548 | chận 549 | chập 550 | chật 551 | chậu 552 | chắc 553 | chắm 554 | chắn 555 | chắp 556 | chắt 557 | chằm 558 | chằn 559 | chằng 560 | chẳng 561 | chẵn 562 | chặc 563 | chặm 564 | chặn 565 | chặng 566 | chặp 567 | chặt 568 | chẹn 569 | chẹo 570 | chẹt 571 | chẻ 572 | chẻo 573 | chẽ 574 | chẽn 575 | chế 576 | chếch 577 | chếnh 578 | chết 579 | chề 580 | chềnh 581 | chểnh 582 | chệ 583 | chệch 584 | chện 585 | chệnh 586 | chỉ 587 | chỉn 588 | chỉnh 589 | chị 590 | chịt 591 | chịu 592 | chọc 593 | chọe 594 | chọi 595 | chọn 596 | chọt 597 | chỏ 598 | chỏi 599 | chỏm 600 | chỏng 601 | chốc 602 | chối 603 | chốn 604 | chống 605 | chốt 606 | chồ 607 | chồi 608 | chồm 609 | chồn 610 | chồng 611 | chổi 612 | chổng 613 | chỗ 614 | chỗi 615 | chỗm 616 | chội 617 | chộn 618 | chộp 619 | chột 620 | chớ 621 | chới 622 | chớm 623 | chớn 624 | chớp 625 | chớt 626 | chờ 627 | chờn 628 | chở 629 | chởm 630 | chợ 631 | chợi 632 | chợn 633 | chợp 634 | chục 635 | chụm 636 | chụp 637 | chụt 638 | chủ 639 | chủng 640 | chứ 641 | chứa 642 | chức 643 | chứng 644 | chừ 645 | chừa 646 | chừng 647 | chửa 648 | chửi 649 | chửng 650 | chữ 651 | chữa 652 | chững 653 | chực 654 | chựng 655 | co 656 | coi 657 | com 658 | con 659 | cong 660 | coóc 661 | cu 662 | cua 663 | cui 664 | cum 665 | cun 666 | cung 667 | cuông 668 | cuốc 669 | cuối 670 | cuốn 671 | cuống 672 | cuồn 673 | cuồng 674 | cuỗm 675 | cuộc 676 | cuội 677 | cuộn 678 | cuộng 679 | cà 680 | cài 681 | càn 682 | càng 683 | cành 684 | cào 685 | càu 686 | cày 687 | cá 688 | các 689 | cách 690 | cái 691 | cám 692 | cán 693 | cáng 694 | cánh 695 | cáo 696 | cáp 697 | cát 698 | cáu 699 | cáy 700 | câm 701 | cân 702 | câng 703 | câu 704 | cây 705 | cãi 706 | cò 707 | còi 708 | còm 709 | còn 710 | còng 711 | có 712 | cóc 713 | cói 714 | cóm 715 | cón 716 | cóng 717 | cóp 718 | cót 719 | cô 720 | côi 721 | côm 722 | côn 723 | công 724 | cõi 725 | cõng 726 | cù 727 | cùi 728 | cùm 729 | cùn 730 | cùng 731 | cú 732 | cúc 733 | cúi 734 | cúm 735 | cún 736 | cúng 737 | cúp 738 | cút 739 | căm 740 | căn 741 | căng 742 | cũ 743 | cũi 744 | cũn 745 | cũng 746 | cơ 747 | cơi 748 | cơm 749 | cơn 750 | cư 751 | cưa 752 | cưng 753 | cưu 754 | cương 755 | cước 756 | cưới 757 | cướp 758 | cười 759 | cườm 760 | cường 761 | cưỡi 762 | cưỡng 763 | cược 764 | cạ 765 | cạc 766 | cạch 767 | cạm 768 | cạn 769 | cạnh 770 | cạo 771 | cạp 772 | cạu 773 | cạy 774 | cả 775 | cải 776 | cảm 777 | cản 778 | cảng 779 | cảnh 780 | cảo 781 | cảu 782 | cấc 783 | cấm 784 | cấn 785 | cấp 786 | cất 787 | cấu 788 | cấy 789 | cầm 790 | cần 791 | cầu 792 | cầy 793 | cẩm 794 | cẩn 795 | cẩu 796 | cẫng 797 | cận 798 | cập 799 | cật 800 | cậu 801 | cậy 802 | cắc 803 | cắm 804 | cắn 805 | cắp 806 | cắt 807 | cằm 808 | cằn 809 | cẳng 810 | cặm 811 | cặn 812 | cặp 813 | cặt 814 | cọ 815 | cọc 816 | cọn 817 | cọng 818 | cọp 819 | cọt 820 | cỏ 821 | cỏi 822 | cỏn 823 | cố 824 | cốc 825 | cối 826 | cốm 827 | cốn 828 | cống 829 | cốp 830 | cốt 831 | cồ 832 | cồm 833 | cồn 834 | cồng 835 | cổ 836 | cổn 837 | cổng 838 | cỗ 839 | cỗi 840 | cộ 841 | cộc 842 | cội 843 | cộm 844 | cộn 845 | cộng 846 | cộp 847 | cột 848 | cớ 849 | cớm 850 | cớn 851 | cớt 852 | cờ 853 | cời 854 | cởi 855 | cỡ 856 | cỡi 857 | cỡm 858 | cỡn 859 | cợn 860 | cợt 861 | cụ 862 | cục 863 | cụi 864 | cụm 865 | cụng 866 | cụp 867 | cụt 868 | củ 869 | của 870 | củi 871 | củm 872 | củn 873 | củng 874 | cứ 875 | cứa 876 | cứng 877 | cứt 878 | cứu 879 | cừ 880 | cừu 881 | cử 882 | cửa 883 | cửi 884 | cửu 885 | cữ 886 | cữu 887 | cự 888 | cựa 889 | cực 890 | cựu 891 | da 892 | dai 893 | dam 894 | dan 895 | dang 896 | danh 897 | dao 898 | day 899 | de 900 | den 901 | deo 902 | di 903 | dim 904 | din 905 | dinh 906 | diên 907 | diêu 908 | diếc 909 | diếp 910 | diết 911 | diềm 912 | diềng 913 | diều 914 | diễm 915 | diễn 916 | diễu 917 | diệc 918 | diệm 919 | diện 920 | diệp 921 | diệt 922 | diệu 923 | do 924 | doa 925 | doanh 926 | doi 927 | dom 928 | don 929 | dong 930 | doãn 931 | du 932 | dua 933 | dun 934 | dung 935 | duy 936 | duyên 937 | duyệt 938 | duôi 939 | duệ 940 | duối 941 | duỗi 942 | dà 943 | dài 944 | dàm 945 | dàn 946 | dàng 947 | dành 948 | dào 949 | dày 950 | dá 951 | dác 952 | dách 953 | dái 954 | dám 955 | dán 956 | dáng 957 | dáo 958 | dát 959 | dáy 960 | dâm 961 | dân 962 | dâng 963 | dâu 964 | dây 965 | dã 966 | dãi 967 | dãn 968 | dãy 969 | dè 970 | dèn 971 | dé 972 | dém 973 | dép 974 | dê 975 | dênh 976 | dì 977 | dìa 978 | dìm 979 | dìu 980 | dí 981 | dính 982 | díp 983 | díu 984 | dò 985 | dòi 986 | dòm 987 | dòng 988 | dó 989 | dóc 990 | dóng 991 | dô 992 | dôi 993 | dông 994 | dõi 995 | dõng 996 | dù 997 | dùi 998 | dùng 999 | dúa 1000 | dúi 1001 | dúm 1002 | dún 1003 | dúng 1004 | dút 1005 | dăm 1006 | dăn 1007 | dăng 1008 | dĩ 1009 | dĩa 1010 | dĩnh 1011 | dũa 1012 | dũi 1013 | dũng 1014 | dơ 1015 | dơi 1016 | dơn 1017 | dư 1018 | dưa 1019 | dưng 1020 | dương 1021 | dưới 1022 | dướn 1023 | dướng 1024 | dường 1025 | dưỡng 1026 | dược 1027 | dượng 1028 | dượt 1029 | dạ 1030 | dạc 1031 | dại 1032 | dạm 1033 | dạn 1034 | dạng 1035 | dạo 1036 | dạt 1037 | dạy 1038 | dả 1039 | dải 1040 | dấm 1041 | dấn 1042 | dấp 1043 | dấu 1044 | dấy 1045 | dầm 1046 | dần 1047 | dầu 1048 | dầy 1049 | dẩn 1050 | dẩu 1051 | dẩy 1052 | dẫm 1053 | dẫn 1054 | dẫu 1055 | dẫy 1056 | dậm 1057 | dận 1058 | dập 1059 | dật 1060 | dậu 1061 | dậy 1062 | dắt 1063 | dằm 1064 | dằn 1065 | dằng 1066 | dẳng 1067 | dặc 1068 | dặm 1069 | dặn 1070 | dặt 1071 | dẹp 1072 | dẹt 1073 | dẻ 1074 | dẻo 1075 | dẽ 1076 | dế 1077 | dề 1078 | dền 1079 | dềnh 1080 | dể 1081 | dễ 1082 | dện 1083 | dệt 1084 | dị 1085 | dịch 1086 | dịp 1087 | dịu 1088 | dọ 1089 | dọa 1090 | dọc 1091 | dọi 1092 | dọn 1093 | dọng 1094 | dọp 1095 | dỏ 1096 | dỏm 1097 | dỏng 1098 | dốc 1099 | dối 1100 | dốt 1101 | dồ 1102 | dồi 1103 | dồn 1104 | dồng 1105 | dổi 1106 | dỗ 1107 | dỗi 1108 | dộc 1109 | dội 1110 | dộng 1111 | dộp 1112 | dột 1113 | dớ 1114 | dớn 1115 | dớp 1116 | dờ 1117 | dời 1118 | dờn 1119 | dở 1120 | dỡ 1121 | dợ 1122 | dợm 1123 | dợn 1124 | dụ 1125 | dục 1126 | dụi 1127 | dụm 1128 | dụng 1129 | dủi 1130 | dứ 1131 | dứa 1132 | dứng 1133 | dứt 1134 | dừ 1135 | dừa 1136 | dừng 1137 | dử 1138 | dửng 1139 | dữ 1140 | dự 1141 | dựa 1142 | dực 1143 | dựng 1144 | e 1145 | em 1146 | en 1147 | eng 1148 | eo 1149 | ga 1150 | gai 1151 | gam 1152 | gan 1153 | gang 1154 | ganh 1155 | gao 1156 | gau 1157 | gay 1158 | ghe 1159 | ghen 1160 | ghi 1161 | ghim 1162 | ghiếc 1163 | ghiền 1164 | ghè 1165 | ghèn 1166 | ghé 1167 | ghém 1168 | ghép 1169 | ghét 1170 | ghê 1171 | ghì 1172 | ghìm 1173 | ghẹ 1174 | ghẹo 1175 | ghẻ 1176 | ghẽ 1177 | ghế 1178 | ghếch 1179 | ghề 1180 | ghềnh 1181 | gi 1182 | gia 1183 | giai 1184 | giam 1185 | gian 1186 | giang 1187 | gianh 1188 | giao 1189 | gien 1190 | gieo 1191 | gin 1192 | gio 1193 | gioi 1194 | giong 1195 | giun 1196 | giuộc 1197 | già 1198 | giàn 1199 | giàng 1200 | giành 1201 | giàu 1202 | giày 1203 | giá 1204 | giác 1205 | giám 1206 | gián 1207 | giáng 1208 | giáo 1209 | giáp 1210 | giát 1211 | giâm 1212 | giây 1213 | giã 1214 | giãi 1215 | giãn 1216 | giãy 1217 | gièm 1218 | gié 1219 | giê 1220 | giêng 1221 | giò 1222 | giòi 1223 | giòn 1224 | gió 1225 | giói 1226 | gióng 1227 | giôn 1228 | giông 1229 | giùm 1230 | giúi 1231 | giúp 1232 | giăm 1233 | giăng 1234 | giũ 1235 | giũa 1236 | giơ 1237 | giương 1238 | giường 1239 | giạ 1240 | giạm 1241 | giạt 1242 | giả 1243 | giải 1244 | giảm 1245 | giản 1246 | giảng 1247 | giảo 1248 | giấc 1249 | giấm 1250 | giấp 1251 | giấu 1252 | giấy 1253 | giầm 1254 | giần 1255 | giầu 1256 | giầy 1257 | giẫm 1258 | giẫy 1259 | giậm 1260 | giận 1261 | giập 1262 | giật 1263 | giậu 1264 | giắt 1265 | giằm 1266 | giằng 1267 | giặc 1268 | giặm 1269 | giặn 1270 | giặt 1271 | giẹp 1272 | giẻ 1273 | giếc 1274 | giếm 1275 | giếng 1276 | giết 1277 | giền 1278 | giềng 1279 | giễu 1280 | giọ 1281 | giọng 1282 | giọt 1283 | giỏ 1284 | giỏi 1285 | giỏng 1286 | giống 1287 | giồng 1288 | giổi 1289 | giỗ 1290 | giội 1291 | giới 1292 | giờ 1293 | giời 1294 | giở 1295 | giỡn 1296 | giụa 1297 | giục 1298 | giụi 1299 | giữ 1300 | giữa 1301 | giựt 1302 | go 1303 | gom 1304 | gon 1305 | goòng 1306 | gu 1307 | guốc 1308 | guồng 1309 | guộc 1310 | gà 1311 | gài 1312 | gàn 1313 | gàng 1314 | gành 1315 | gào 1316 | gàu 1317 | gày 1318 | gá 1319 | gác 1320 | gái 1321 | gán 1322 | gánh 1323 | gáo 1324 | gáp 1325 | gáy 1326 | gân 1327 | gâu 1328 | gây 1329 | gã 1330 | gãi 1331 | gãy 1332 | gì 1333 | gìn 1334 | gí 1335 | gích 1336 | gò 1337 | gòn 1338 | góa 1339 | góc 1340 | góp 1341 | gót 1342 | gô 1343 | gôm 1344 | gôn 1345 | gông 1346 | gõ 1347 | gù 1348 | gùi 1349 | gút 1350 | găm 1351 | găng 1352 | gũi 1353 | gơ 1354 | gươm 1355 | gương 1356 | gườm 1357 | gượng 1358 | gạ 1359 | gạc 1360 | gạch 1361 | gạn 1362 | gạo 1363 | gạt 1364 | gả 1365 | gảnh 1366 | gảy 1367 | gấc 1368 | gấm 1369 | gấp 1370 | gấu 1371 | gấy 1372 | gầm 1373 | gần 1374 | gầu 1375 | gầy 1376 | gẩm 1377 | gẩy 1378 | gẫm 1379 | gẫu 1380 | gẫy 1381 | gậm 1382 | gập 1383 | gật 1384 | gậy 1385 | gắm 1386 | gắn 1387 | gắng 1388 | gắp 1389 | gắt 1390 | gằm 1391 | gằn 1392 | gặc 1393 | gặm 1394 | gặng 1395 | gặp 1396 | gặt 1397 | gỉ 1398 | gọi 1399 | gọn 1400 | gọng 1401 | gọt 1402 | gỏi 1403 | gỏng 1404 | gốc 1405 | gối 1406 | gốm 1407 | gồ 1408 | gồi 1409 | gồm 1410 | gồng 1411 | gổ 1412 | gỗ 1413 | gộc 1414 | gội 1415 | gộp 1416 | gột 1417 | gớm 1418 | gờ 1419 | gờm 1420 | gờn 1421 | gở 1422 | gởi 1423 | gỡ 1424 | gợi 1425 | gợn 1426 | gợt 1427 | gụ 1428 | gục 1429 | gụi 1430 | gừ 1431 | gừng 1432 | gửi 1433 | ha 1434 | hai 1435 | ham 1436 | han 1437 | hang 1438 | hanh 1439 | hao 1440 | hau 1441 | hay 1442 | he 1443 | hem 1444 | hen 1445 | heo 1446 | hi 1447 | hia 1448 | him 1449 | hin 1450 | hiu 1451 | hiên 1452 | hiêng 1453 | hiếm 1454 | hiến 1455 | hiếng 1456 | hiếp 1457 | hiếu 1458 | hiềm 1459 | hiền 1460 | hiểm 1461 | hiển 1462 | hiểu 1463 | hiện 1464 | hiệp 1465 | hiệt 1466 | hiệu 1467 | ho 1468 | hoa 1469 | hoai 1470 | hoan 1471 | hoang 1472 | hoay 1473 | hoe 1474 | hoen 1475 | hoi 1476 | hom 1477 | hon 1478 | hong 1479 | hoài 1480 | hoàn 1481 | hoành 1482 | hoác 1483 | hoán 1484 | hoánh 1485 | hoáy 1486 | hoãn 1487 | hoét 1488 | hoạch 1489 | hoại 1490 | hoạn 1491 | hoạnh 1492 | hoạt 1493 | hoải 1494 | hoảng 1495 | hoảnh 1496 | hoắc 1497 | hoắm 1498 | hoắt 1499 | hoằn 1500 | hoẵng 1501 | hoặc 1502 | hu 1503 | hua 1504 | hui 1505 | hum 1506 | hun 1507 | hung 1508 | huy 1509 | huynh 1510 | huyên 1511 | huyết 1512 | huyền 1513 | huyễn 1514 | huyện 1515 | huyệt 1516 | huân 1517 | huê 1518 | huênh 1519 | huých 1520 | huýt 1521 | huơ 1522 | huấn 1523 | huế 1524 | huề 1525 | huệ 1526 | huống 1527 | huỳnh 1528 | huỵch 1529 | hà 1530 | hài 1531 | hàm 1532 | hàn 1533 | hàng 1534 | hành 1535 | hào 1536 | hàu 1537 | há 1538 | hác 1539 | hách 1540 | hái 1541 | hám 1542 | hán 1543 | háng 1544 | háo 1545 | hát 1546 | háu 1547 | háy 1548 | hâm 1549 | hân 1550 | hâu 1551 | hây 1552 | hãi 1553 | hãm 1554 | hãn 1555 | hãng 1556 | hãnh 1557 | hão 1558 | hãy 1559 | hè 1560 | hèm 1561 | hèn 1562 | hèo 1563 | hé 1564 | héc 1565 | héo 1566 | hét 1567 | hê 1568 | hên 1569 | hênh 1570 | hì 1571 | hình 1572 | hí 1573 | hích 1574 | híp 1575 | hít 1576 | hò 1577 | hòa 1578 | hòe 1579 | hòi 1580 | hòm 1581 | hòn 1582 | hòng 1583 | hó 1584 | hóa 1585 | hóc 1586 | hói 1587 | hóm 1588 | hóng 1589 | hóp 1590 | hót 1591 | hô 1592 | hôi 1593 | hôm 1594 | hôn 1595 | hông 1596 | hõm 1597 | hù 1598 | hùa 1599 | hùi 1600 | hùm 1601 | hùn 1602 | hùng 1603 | hú 1604 | húc 1605 | húi 1606 | húng 1607 | húp 1608 | hút 1609 | húy 1610 | hăm 1611 | hăng 1612 | hĩ 1613 | hĩnh 1614 | hị 1615 | hũ 1616 | hơ 1617 | hơi 1618 | hơn 1619 | hư 1620 | hưng 1621 | hưu 1622 | hươm 1623 | hươn 1624 | hương 1625 | hươu 1626 | hước 1627 | hướng 1628 | hườm 1629 | hường 1630 | hưởng 1631 | hượm 1632 | hạ 1633 | hạc 1634 | hạch 1635 | hại 1636 | hạm 1637 | hạn 1638 | hạng 1639 | hạnh 1640 | hạo 1641 | hạp 1642 | hạt 1643 | hả 1644 | hải 1645 | hảng 1646 | hảnh 1647 | hảo 1648 | hấn 1649 | hấp 1650 | hất 1651 | hấu 1652 | hấy 1653 | hầm 1654 | hầu 1655 | hầy 1656 | hẩm 1657 | hẩu 1658 | hẫng 1659 | hẫu 1660 | hậm 1661 | hận 1662 | hập 1663 | hậu 1664 | hắc 1665 | hắn 1666 | hắng 1667 | hắt 1668 | hằm 1669 | hằn 1670 | hằng 1671 | hẳn 1672 | hẵng 1673 | hặc 1674 | hẹ 1675 | hẹn 1676 | hẹp 1677 | hẻm 1678 | hẻn 1679 | hẻo 1680 | hẽm 1681 | hếch 1682 | hến 1683 | hết 1684 | hếu 1685 | hề 1686 | hể 1687 | hển 1688 | hễ 1689 | hệ 1690 | hệt 1691 | hỉ 1692 | hỉnh 1693 | họ 1694 | họa 1695 | học 1696 | họe 1697 | họng 1698 | họp 1699 | hỏa 1700 | hỏi 1701 | hỏn 1702 | hỏng 1703 | hố 1704 | hốc 1705 | hối 1706 | hống 1707 | hốt 1708 | hồ 1709 | hồi 1710 | hồn 1711 | hồng 1712 | hổ 1713 | hổi 1714 | hổm 1715 | hổn 1716 | hổng 1717 | hỗ 1718 | hỗn 1719 | hỗng 1720 | hộ 1721 | hộc 1722 | hội 1723 | hộp 1724 | hột 1725 | hớ 1726 | hớm 1727 | hớn 1728 | hớp 1729 | hớt 1730 | hờ 1731 | hời 1732 | hờn 1733 | hở 1734 | hởi 1735 | hỡ 1736 | hỡi 1737 | hợi 1738 | hợm 1739 | hợp 1740 | hợt 1741 | hụ 1742 | hục 1743 | hụi 1744 | hụp 1745 | hụt 1746 | hủ 1747 | hủi 1748 | hủy 1749 | hứa 1750 | hức 1751 | hứng 1752 | hừ 1753 | hừng 1754 | hử 1755 | hửng 1756 | hữ 1757 | hững 1758 | hữu 1759 | hực 1760 | i 1761 | im 1762 | in 1763 | inh 1764 | iu 1765 | ke 1766 | kem 1767 | ken 1768 | keng 1769 | keo 1770 | kha 1771 | khai 1772 | kham 1773 | khan 1774 | khang 1775 | khanh 1776 | khao 1777 | khau 1778 | khay 1779 | khe 1780 | khem 1781 | khen 1782 | kheo 1783 | khi 1784 | khin 1785 | khinh 1786 | khiu 1787 | khiêm 1788 | khiên 1789 | khiêng 1790 | khiêu 1791 | khiếm 1792 | khiến 1793 | khiếp 1794 | khiết 1795 | khiếu 1796 | khiền 1797 | khiển 1798 | khiễng 1799 | kho 1800 | khoa 1801 | khoai 1802 | khoan 1803 | khoang 1804 | khoanh 1805 | khoe 1806 | khoen 1807 | khoeo 1808 | khoi 1809 | khom 1810 | khoác 1811 | khoái 1812 | khoán 1813 | khoáng 1814 | khoát 1815 | khoáy 1816 | khoèo 1817 | khoét 1818 | khoăn 1819 | khoải 1820 | khoản 1821 | khoảng 1822 | khoảnh 1823 | khoắn 1824 | khoắng 1825 | khoắt 1826 | khoằm 1827 | khu 1828 | khua 1829 | khui 1830 | khum 1831 | khung 1832 | khuy 1833 | khuya 1834 | khuynh 1835 | khuyên 1836 | khuyến 1837 | khuyết 1838 | khuyển 1839 | khuân 1840 | khuâng 1841 | khuây 1842 | khuê 1843 | khuôn 1844 | khuông 1845 | khuơ 1846 | khuất 1847 | khuấy 1848 | khuẩn 1849 | khuếch 1850 | khuỳnh 1851 | khuỵu 1852 | khuỷu 1853 | khà 1854 | khàn 1855 | khàng 1856 | khá 1857 | khác 1858 | khách 1859 | khái 1860 | khám 1861 | khán 1862 | kháng 1863 | khánh 1864 | kháo 1865 | kháu 1866 | kháy 1867 | khâm 1868 | khân 1869 | khâu 1870 | khè 1871 | khèn 1872 | khé 1873 | khén 1874 | khéo 1875 | khép 1876 | khét 1877 | khê 1878 | khênh 1879 | khêu 1880 | khì 1881 | khìn 1882 | khí 1883 | khía 1884 | khích 1885 | khít 1886 | khíu 1887 | khò 1888 | khòm 1889 | khòng 1890 | khó 1891 | khóa 1892 | khóc 1893 | khóe 1894 | khói 1895 | khóm 1896 | khô 1897 | khôi 1898 | khôn 1899 | không 1900 | khù 1901 | khùng 1902 | khú 1903 | khúc 1904 | khúm 1905 | khăm 1906 | khăn 1907 | khăng 1908 | khơ 1909 | khơi 1910 | khư 1911 | khươn 1912 | khước 1913 | khướt 1914 | khướu 1915 | khưỡng 1916 | khạc 1917 | khạng 1918 | khạo 1919 | khạp 1920 | khả 1921 | khải 1922 | khảm 1923 | khản 1924 | khảng 1925 | khảnh 1926 | khảo 1927 | khấc 1928 | khấm 1929 | khấn 1930 | khấp 1931 | khất 1932 | khấu 1933 | khẩn 1934 | khẩu 1935 | khẩy 1936 | khập 1937 | khật 1938 | khắc 1939 | khắn 1940 | khắp 1941 | khắt 1942 | khằng 1943 | khẳm 1944 | khẳn 1945 | khẳng 1946 | khặc 1947 | khẻ 1948 | khẽ 1949 | khế 1950 | khề 1951 | khềnh 1952 | khều 1953 | khểnh 1954 | khễnh 1955 | khệ 1956 | khệnh 1957 | khỉ 1958 | khỉnh 1959 | khịa 1960 | khịt 1961 | khọm 1962 | khỏ 1963 | khỏa 1964 | khỏe 1965 | khỏi 1966 | khỏng 1967 | khố 1968 | khốc 1969 | khối 1970 | khốn 1971 | khống 1972 | khổ 1973 | khổng 1974 | khới 1975 | khớp 1976 | khờ 1977 | khởi 1978 | khụ 1979 | khục 1980 | khụt 1981 | khụy 1982 | khủ 1983 | khủng 1984 | khứ 1985 | khứa 1986 | khứu 1987 | khừ 1988 | khừng 1989 | khử 1990 | khựng 1991 | ki 1992 | kia 1993 | kim 1994 | kinh 1995 | kiêm 1996 | kiên 1997 | kiêng 1998 | kiêu 1999 | kiếm 2000 | kiến 2001 | kiếng 2002 | kiếp 2003 | kiết 2004 | kiếu 2005 | kiềm 2006 | kiền 2007 | kiềng 2008 | kiều 2009 | kiểm 2010 | kiểng 2011 | kiểu 2012 | kiễng 2013 | kiệm 2014 | kiện 2015 | kiệt 2016 | kiệu 2017 | kè 2018 | kèm 2019 | kèn 2020 | kèo 2021 | ké 2022 | kém 2023 | kén 2024 | kéo 2025 | kép 2026 | két 2027 | kê 2028 | kên 2029 | kênh 2030 | kêu 2031 | kì 2032 | kìa 2033 | kìm 2034 | kìn 2035 | kình 2036 | kí 2037 | ký 2038 | kích 2039 | kín 2040 | kính 2041 | kíp 2042 | kít 2043 | kĩ 2044 | kẹ 2045 | kẹn 2046 | kẹo 2047 | kẹp 2048 | kẹt 2049 | kẻ 2050 | kẻng 2051 | kẻo 2052 | kẽ 2053 | kẽm 2054 | kẽo 2055 | kế 2056 | kếch 2057 | kếp 2058 | kết 2059 | kếu 2060 | kề 2061 | kềm 2062 | kền 2063 | kềnh 2064 | kể 2065 | kệ 2066 | kệch 2067 | kệnh 2068 | kỉ 2069 | kỉnh 2070 | kị 2071 | kịch 2072 | kịp 2073 | kịt 2074 | la 2075 | lai 2076 | lam 2077 | lan 2078 | lang 2079 | lanh 2080 | lao 2081 | lau 2082 | lay 2083 | le 2084 | lem 2085 | len 2086 | leng 2087 | leo 2088 | li 2089 | lia 2090 | lim 2091 | lin 2092 | linh 2093 | liu 2094 | liêm 2095 | liên 2096 | liêng 2097 | liêu 2098 | liếc 2099 | liếm 2100 | liến 2101 | liếng 2102 | liếp 2103 | liềm 2104 | liền 2105 | liều 2106 | liểng 2107 | liễm 2108 | liễn 2109 | liễu 2110 | liệm 2111 | liệng 2112 | liệp 2113 | liệt 2114 | liệu 2115 | lo 2116 | loa 2117 | loan 2118 | loang 2119 | loanh 2120 | loay 2121 | loe 2122 | loi 2123 | lom 2124 | lon 2125 | long 2126 | loài 2127 | loàn 2128 | loàng 2129 | loáng 2130 | loát 2131 | loãng 2132 | loét 2133 | loăng 2134 | loại 2135 | loạn 2136 | loạng 2137 | loạt 2138 | loảng 2139 | loắt 2140 | loằng 2141 | loẹt 2142 | lu 2143 | lua 2144 | lui 2145 | lum 2146 | lung 2147 | luya 2148 | luyn 2149 | luyến 2150 | luyện 2151 | luân 2152 | luôn 2153 | luông 2154 | luấn 2155 | luẩn 2156 | luận 2157 | luật 2158 | luốc 2159 | luống 2160 | luốt 2161 | luồn 2162 | luồng 2163 | luộc 2164 | luộm 2165 | là 2166 | lài 2167 | làm 2168 | làn 2169 | làng 2170 | lành 2171 | lào 2172 | làu 2173 | lá 2174 | lác 2175 | lách 2176 | lái 2177 | lán 2178 | láng 2179 | lánh 2180 | láo 2181 | láp 2182 | lát 2183 | láu 2184 | láy 2185 | lâm 2186 | lân 2187 | lâng 2188 | lâu 2189 | lây 2190 | lã 2191 | lãi 2192 | lãm 2193 | lãn 2194 | lãng 2195 | lãnh 2196 | lão 2197 | lè 2198 | lèm 2199 | lèn 2200 | lèo 2201 | lé 2202 | léc 2203 | lém 2204 | lén 2205 | léng 2206 | léo 2207 | lép 2208 | lét 2209 | lê 2210 | lên 2211 | lênh 2212 | lêu 2213 | lì 2214 | lìa 2215 | lìm 2216 | lình 2217 | lìu 2218 | lí 2219 | lích 2220 | lính 2221 | líp 2222 | lít 2223 | líu 2224 | lò 2225 | lòa 2226 | lòe 2227 | lòi 2228 | lòm 2229 | lòng 2230 | ló 2231 | lóa 2232 | lóc 2233 | lóe 2234 | lói 2235 | lóm 2236 | lóng 2237 | lóp 2238 | lót 2239 | lô 2240 | lôi 2241 | lôm 2242 | lông 2243 | lõ 2244 | lõa 2245 | lõi 2246 | lõm 2247 | lõng 2248 | lù 2249 | lùa 2250 | lùi 2251 | lùm 2252 | lùn 2253 | lùng 2254 | lú 2255 | lúa 2256 | lúc 2257 | lúi 2258 | lúm 2259 | lún 2260 | lúng 2261 | lúp 2262 | lút 2263 | lúy 2264 | lăm 2265 | lăn 2266 | lăng 2267 | lũ 2268 | lũa 2269 | lũi 2270 | lũm 2271 | lũn 2272 | lũng 2273 | lũy 2274 | lơ 2275 | lơi 2276 | lơn 2277 | lư 2278 | lưa 2279 | lưng 2280 | lưu 2281 | lươn 2282 | lương 2283 | lưới 2284 | lướt 2285 | lười 2286 | lườm 2287 | lườn 2288 | lường 2289 | lưỡi 2290 | lưỡng 2291 | lược 2292 | lượm 2293 | lượn 2294 | lượng 2295 | lượt 2296 | lạ 2297 | lạc 2298 | lạch 2299 | lại 2300 | lạm 2301 | lạn 2302 | lạng 2303 | lạnh 2304 | lạo 2305 | lạp 2306 | lạt 2307 | lạy 2308 | lả 2309 | lải 2310 | lảm 2311 | lảng 2312 | lảnh 2313 | lảo 2314 | lảy 2315 | lấc 2316 | lấm 2317 | lấn 2318 | lấp 2319 | lất 2320 | lấy 2321 | lầm 2322 | lần 2323 | lầu 2324 | lầy 2325 | lẩm 2326 | lẩn 2327 | lẩu 2328 | lẩy 2329 | lẫm 2330 | lẫn 2331 | lẫy 2332 | lận 2333 | lập 2334 | lật 2335 | lậu 2336 | lậy 2337 | lắc 2338 | lắm 2339 | lắng 2340 | lắp 2341 | lắt 2342 | lằm 2343 | lằn 2344 | lằng 2345 | lẳng 2346 | lẵng 2347 | lặc 2348 | lặm 2349 | lặn 2350 | lặng 2351 | lặp 2352 | lặt 2353 | lẹ 2354 | lẹm 2355 | lẹo 2356 | lẹp 2357 | lẹt 2358 | lẻ 2359 | lẻm 2360 | lẻn 2361 | lẻng 2362 | lẻo 2363 | lẽ 2364 | lẽn 2365 | lẽo 2366 | lếch 2367 | lết 2368 | lếu 2369 | lề 2370 | lềnh 2371 | lều 2372 | lể 2373 | lễ 2374 | lệ 2375 | lệch 2376 | lệnh 2377 | lệt 2378 | lỉnh 2379 | lỉu 2380 | lị 2381 | lịa 2382 | lịch 2383 | lịm 2384 | lịnh 2385 | lọ 2386 | lọc 2387 | lọi 2388 | lọm 2389 | lọn 2390 | lọng 2391 | lọp 2392 | lọt 2393 | lỏi 2394 | lỏm 2395 | lỏn 2396 | lỏng 2397 | lố 2398 | lốc 2399 | lối 2400 | lốm 2401 | lốn 2402 | lốp 2403 | lốt 2404 | lồ 2405 | lồi 2406 | lồm 2407 | lồng 2408 | lổ 2409 | lổm 2410 | lổn 2411 | lổng 2412 | lỗ 2413 | lỗi 2414 | lộ 2415 | lộc 2416 | lội 2417 | lộn 2418 | lộng 2419 | lộp 2420 | lột 2421 | lớ 2422 | lới 2423 | lớn 2424 | lớp 2425 | lớt 2426 | lờ 2427 | lời 2428 | lờm 2429 | lờn 2430 | lở 2431 | lởi 2432 | lởm 2433 | lởn 2434 | lỡ 2435 | lỡm 2436 | lợ 2437 | lợi 2438 | lợm 2439 | lợn 2440 | lợp 2441 | lợt 2442 | lụ 2443 | lụa 2444 | lục 2445 | lụi 2446 | lụm 2447 | lụn 2448 | lụng 2449 | lụp 2450 | lụt 2451 | lụy 2452 | lủ 2453 | lủi 2454 | lủn 2455 | lủng 2456 | lứa 2457 | lức 2458 | lứt 2459 | lừ 2460 | lừa 2461 | lừng 2462 | lử 2463 | lửa 2464 | lửng 2465 | lữ 2466 | lữa 2467 | lững 2468 | lự 2469 | lựa 2470 | lực 2471 | lựng 2472 | lựu 2473 | ma 2474 | mai 2475 | man 2476 | mang 2477 | manh 2478 | mao 2479 | mau 2480 | may 2481 | me 2482 | men 2483 | meng 2484 | meo 2485 | mi 2486 | mia 2487 | min 2488 | minh 2489 | miên 2490 | miêu 2491 | miến 2492 | miếng 2493 | miết 2494 | miếu 2495 | miền 2496 | miều 2497 | miễn 2498 | miễu 2499 | miện 2500 | miệng 2501 | miệt 2502 | mo 2503 | moay 2504 | moi 2505 | mom 2506 | mon 2507 | mong 2508 | moong 2509 | moóc 2510 | mu 2511 | mua 2512 | mui 2513 | mun 2514 | mung 2515 | muôi 2516 | muôn 2517 | muông 2518 | muối 2519 | muốn 2520 | muống 2521 | muốt 2522 | muồi 2523 | muồng 2524 | muỗi 2525 | muỗm 2526 | muỗng 2527 | muội 2528 | muộn 2529 | my 2530 | mà 2531 | mài 2532 | màn 2533 | màng 2534 | mành 2535 | mào 2536 | màu 2537 | mày 2538 | má 2539 | mác 2540 | mách 2541 | mái 2542 | máng 2543 | mánh 2544 | máo 2545 | mát 2546 | máu 2547 | máy 2548 | mâm 2549 | mân 2550 | mâu 2551 | mây 2552 | mã 2553 | mãi 2554 | mãn 2555 | mãng 2556 | mãnh 2557 | mão 2558 | mè 2559 | mèm 2560 | mèn 2561 | mèo 2562 | mé 2563 | méc 2564 | mém 2565 | mén 2566 | méo 2567 | mép 2568 | mét 2569 | mê 2570 | mên 2571 | mênh 2572 | mì 2573 | mìn 2574 | mình 2575 | mí 2576 | mía 2577 | mích 2578 | mím 2579 | míp 2580 | mít 2581 | mò 2582 | mòi 2583 | mòn 2584 | mòng 2585 | mó 2586 | móc 2587 | mói 2588 | móm 2589 | món 2590 | móng 2591 | móp 2592 | mót 2593 | mô 2594 | môi 2595 | môn 2596 | mông 2597 | mõ 2598 | mõm 2599 | mù 2600 | mùa 2601 | mùi 2602 | mùn 2603 | mùng 2604 | mú 2605 | múa 2606 | múc 2607 | múi 2608 | mún 2609 | múp 2610 | mút 2611 | măm 2612 | măn 2613 | măng 2614 | mĩ 2615 | mĩm 2616 | mũ 2617 | mũi 2618 | mũm 2619 | mơ 2620 | mơn 2621 | mưa 2622 | mưng 2623 | mưu 2624 | mươi 2625 | mương 2626 | mướn 2627 | mướp 2628 | mướt 2629 | mười 2630 | mường 2631 | mượn 2632 | mượt 2633 | mạ 2634 | mạc 2635 | mạch 2636 | mại 2637 | mạn 2638 | mạng 2639 | mạnh 2640 | mạo 2641 | mạp 2642 | mạt 2643 | mạy 2644 | mả 2645 | mải 2646 | mảng 2647 | mảnh 2648 | mảy 2649 | mấn 2650 | mấp 2651 | mất 2652 | mấu 2653 | mấy 2654 | mầm 2655 | mần 2656 | mầu 2657 | mầy 2658 | mẩm 2659 | mẩn 2660 | mẩu 2661 | mẩy 2662 | mẫm 2663 | mẫn 2664 | mẫu 2665 | mậm 2666 | mận 2667 | mập 2668 | mật 2669 | mậu 2670 | mắc 2671 | mắm 2672 | mắn 2673 | mắng 2674 | mắt 2675 | mằn 2676 | mẳn 2677 | mặc 2678 | mặn 2679 | mặt 2680 | mẹ 2681 | mẹo 2682 | mẹp 2683 | mẹt 2684 | mẻ 2685 | mẽ 2686 | mếch 2687 | mến 2688 | mết 2689 | mếu 2690 | mề 2691 | mềm 2692 | mền 2693 | mễ 2694 | mệ 2695 | mệnh 2696 | mệt 2697 | mỉ 2698 | mỉa 2699 | mỉm 2700 | mị 2701 | mịch 2702 | mịn 2703 | mịt 2704 | mọ 2705 | mọc 2706 | mọi 2707 | mọn 2708 | mọng 2709 | mọp 2710 | mọt 2711 | mỏ 2712 | mỏi 2713 | mỏm 2714 | mỏng 2715 | mố 2716 | mốc 2717 | mối 2718 | mống 2719 | mốt 2720 | mồ 2721 | mồi 2722 | mồm 2723 | mồn 2724 | mồng 2725 | mổ 2726 | mỗ 2727 | mỗi 2728 | mộ 2729 | mộc 2730 | mội 2731 | mộng 2732 | một 2733 | mớ 2734 | mới 2735 | mớm 2736 | mớn 2737 | mờ 2738 | mời 2739 | mở 2740 | mởn 2741 | mỡ 2742 | mợ 2743 | mụ 2744 | mục 2745 | mụn 2746 | mụt 2747 | mủ 2748 | mủi 2749 | mủm 2750 | mủn 2751 | mủng 2752 | mứa 2753 | mức 2754 | mứt 2755 | mừng 2756 | mửa 2757 | mửng 2758 | mực 2759 | mỹ 2760 | na 2761 | nai 2762 | nam 2763 | nan 2764 | nang 2765 | nanh 2766 | nao 2767 | nay 2768 | ne 2769 | nem 2770 | nen 2771 | neo 2772 | nga 2773 | ngai 2774 | ngan 2775 | ngang 2776 | ngao 2777 | ngau 2778 | ngay 2779 | nghe 2780 | nghen 2781 | nghi 2782 | nghinh 2783 | nghiêm 2784 | nghiên 2785 | nghiêng 2786 | nghiến 2787 | nghiền 2788 | nghiễm 2789 | nghiệm 2790 | nghiện 2791 | nghiệp 2792 | nghiệt 2793 | nghè 2794 | nghèn 2795 | nghèo 2796 | nghé 2797 | nghén 2798 | nghét 2799 | nghê 2800 | nghênh 2801 | nghêu 2802 | nghì 2803 | nghìn 2804 | nghía 2805 | nghĩ 2806 | nghĩa 2807 | nghĩnh 2808 | nghẹ 2809 | nghẹn 2810 | nghẹo 2811 | nghẹt 2812 | nghẽn 2813 | nghẽo 2814 | nghếch 2815 | nghề 2816 | nghều 2817 | nghể 2818 | nghển 2819 | nghểnh 2820 | nghểu 2821 | nghễ 2822 | nghễnh 2823 | nghễu 2824 | nghệ 2825 | nghệch 2826 | nghện 2827 | nghỉ 2828 | nghỉm 2829 | nghỉu 2830 | nghị 2831 | nghịch 2832 | nghịt 2833 | nghịu 2834 | ngo 2835 | ngoa 2836 | ngoai 2837 | ngoan 2838 | ngoay 2839 | ngoe 2840 | ngoi 2841 | ngon 2842 | ngoài 2843 | ngoác 2844 | ngoái 2845 | ngoáo 2846 | ngoáy 2847 | ngoãn 2848 | ngoèo 2849 | ngoéo 2850 | ngoét 2851 | ngoạc 2852 | ngoại 2853 | ngoạm 2854 | ngoạn 2855 | ngoạy 2856 | ngoải 2857 | ngoảnh 2858 | ngoảy 2859 | ngoắc 2860 | ngoắt 2861 | ngoằn 2862 | ngoằng 2863 | ngoẵng 2864 | ngoặc 2865 | ngoặt 2866 | ngoẹo 2867 | ngoẻo 2868 | ngu 2869 | nguy 2870 | nguyên 2871 | nguyền 2872 | nguyện 2873 | nguyệt 2874 | nguây 2875 | nguôi 2876 | nguýt 2877 | nguẩy 2878 | nguậy 2879 | nguệch 2880 | nguồn 2881 | nguội 2882 | ngà 2883 | ngài 2884 | ngàm 2885 | ngàn 2886 | ngàng 2887 | ngành 2888 | ngào 2889 | ngàu 2890 | ngày 2891 | ngác 2892 | ngách 2893 | ngái 2894 | ngán 2895 | ngáng 2896 | ngáo 2897 | ngáp 2898 | ngát 2899 | ngáy 2900 | ngâm 2901 | ngân 2902 | ngâu 2903 | ngây 2904 | ngã 2905 | ngãi 2906 | ngãng 2907 | ngò 2908 | ngòi 2909 | ngòm 2910 | ngó 2911 | ngóc 2912 | ngói 2913 | ngóm 2914 | ngón 2915 | ngóng 2916 | ngóp 2917 | ngót 2918 | ngô 2919 | ngôi 2920 | ngôn 2921 | ngông 2922 | ngõ 2923 | ngù 2924 | ngùi 2925 | ngùn 2926 | ngùng 2927 | ngún 2928 | ngúng 2929 | ngút 2930 | ngăm 2931 | ngăn 2932 | ngũ 2933 | ngơ 2934 | ngơi 2935 | ngư 2936 | ngưa 2937 | ngưng 2938 | ngưu 2939 | ngươi 2940 | ngước 2941 | người 2942 | ngưởng 2943 | ngưỡng 2944 | ngược 2945 | ngượng 2946 | ngạc 2947 | ngạch 2948 | ngại 2949 | ngạn 2950 | ngạnh 2951 | ngạo 2952 | ngạt 2953 | ngả 2954 | ngải 2955 | ngấm 2956 | ngấn 2957 | ngấp 2958 | ngất 2959 | ngấu 2960 | ngấy 2961 | ngầm 2962 | ngần 2963 | ngầu 2964 | ngầy 2965 | ngẩm 2966 | ngẩn 2967 | ngẩng 2968 | ngẫm 2969 | ngẫu 2970 | ngậm 2971 | ngập 2972 | ngật 2973 | ngậy 2974 | ngắc 2975 | ngắm 2976 | ngắn 2977 | ngắt 2978 | ngằn 2979 | ngặt 2980 | ngọ 2981 | ngọc 2982 | ngọn 2983 | ngọng 2984 | ngọt 2985 | ngỏ 2986 | ngố 2987 | ngốc 2988 | ngốn 2989 | ngồ 2990 | ngồi 2991 | ngồn 2992 | ngồng 2993 | ngổ 2994 | ngổm 2995 | ngổn 2996 | ngỗ 2997 | ngỗng 2998 | ngộ 2999 | ngộc 3000 | ngộn 3001 | ngột 3002 | ngớ 3003 | ngớn 3004 | ngớt 3005 | ngờ 3006 | ngời 3007 | ngỡ 3008 | ngợ 3009 | ngợi 3010 | ngợm 3011 | ngợp 3012 | ngụ 3013 | ngụa 3014 | ngục 3015 | ngụm 3016 | ngụp 3017 | ngụt 3018 | ngụy 3019 | ngủ 3020 | ngủi 3021 | ngủn 3022 | ngứ 3023 | ngứa 3024 | ngừ 3025 | ngừa 3026 | ngừng 3027 | ngửa 3028 | ngửi 3029 | ngữ 3030 | ngự 3031 | ngựa 3032 | ngực 3033 | nha 3034 | nhai 3035 | nham 3036 | nhan 3037 | nhang 3038 | nhanh 3039 | nhao 3040 | nhau 3041 | nhay 3042 | nhe 3043 | nhem 3044 | nhen 3045 | nheo 3046 | nhi 3047 | nhinh 3048 | nhiên 3049 | nhiêu 3050 | nhiếc 3051 | nhiếp 3052 | nhiều 3053 | nhiễm 3054 | nhiễn 3055 | nhiễu 3056 | nhiệm 3057 | nhiệt 3058 | nho 3059 | nhoai 3060 | nhoay 3061 | nhoe 3062 | nhoi 3063 | nhom 3064 | nhon 3065 | nhong 3066 | nhoài 3067 | nhoàm 3068 | nhoáng 3069 | nhoáy 3070 | nhoèn 3071 | nhoét 3072 | nhoạng 3073 | nhoẹt 3074 | nhoẻn 3075 | nhu 3076 | nhum 3077 | nhung 3078 | nhuyễn 3079 | nhuần 3080 | nhuận 3081 | nhuệ 3082 | nhuốc 3083 | nhuốm 3084 | nhuộm 3085 | nhà 3086 | nhài 3087 | nhàm 3088 | nhàn 3089 | nhàng 3090 | nhành 3091 | nhào 3092 | nhàu 3093 | nhá 3094 | nhác 3095 | nhách 3096 | nhái 3097 | nhám 3098 | nhánh 3099 | nháo 3100 | nháp 3101 | nhát 3102 | nháy 3103 | nhâm 3104 | nhân 3105 | nhâng 3106 | nhâu 3107 | nhã 3108 | nhãi 3109 | nhãn 3110 | nhãng 3111 | nhão 3112 | nhè 3113 | nhèm 3114 | nhèo 3115 | nhé 3116 | nhéo 3117 | nhép 3118 | nhét 3119 | nhì 3120 | nhìn 3121 | nhí 3122 | nhích 3123 | nhím 3124 | nhín 3125 | nhíp 3126 | nhít 3127 | nhíu 3128 | nhòa 3129 | nhòe 3130 | nhòm 3131 | nhòng 3132 | nhó 3133 | nhóc 3134 | nhói 3135 | nhóm 3136 | nhón 3137 | nhóng 3138 | nhóp 3139 | nhót 3140 | nhô 3141 | nhôm 3142 | nhông 3143 | nhõm 3144 | nhõng 3145 | nhùi 3146 | nhùng 3147 | nhú 3148 | nhúa 3149 | nhúc 3150 | nhúm 3151 | nhún 3152 | nhúng 3153 | nhút 3154 | nhăm 3155 | nhăn 3156 | nhăng 3157 | nhĩ 3158 | nhũ 3159 | nhũn 3160 | nhũng 3161 | nhơ 3162 | nhơn 3163 | như 3164 | nhưng 3165 | nhương 3166 | nhướn 3167 | nhướng 3168 | nhường 3169 | nhưỡng 3170 | nhược 3171 | nhượng 3172 | nhạ 3173 | nhạc 3174 | nhại 3175 | nhạn 3176 | nhạnh 3177 | nhạo 3178 | nhạt 3179 | nhạy 3180 | nhả 3181 | nhải 3182 | nhảm 3183 | nhản 3184 | nhảnh 3185 | nhảu 3186 | nhảy 3187 | nhấc 3188 | nhấm 3189 | nhấn 3190 | nhấp 3191 | nhất 3192 | nhầm 3193 | nhầu 3194 | nhầy 3195 | nhẩm 3196 | nhẩn 3197 | nhẩu 3198 | nhẩy 3199 | nhẫn 3200 | nhẫy 3201 | nhậm 3202 | nhận 3203 | nhập 3204 | nhật 3205 | nhậu 3206 | nhậy 3207 | nhắc 3208 | nhắm 3209 | nhắn 3210 | nhắng 3211 | nhắp 3212 | nhắt 3213 | nhằm 3214 | nhằn 3215 | nhằng 3216 | nhẳn 3217 | nhẳng 3218 | nhẵn 3219 | nhẵng 3220 | nhặn 3221 | nhặng 3222 | nhặt 3223 | nhẹ 3224 | nhẹm 3225 | nhẹn 3226 | nhẹo 3227 | nhẹp 3228 | nhẹt 3229 | nhẻ 3230 | nhẻm 3231 | nhẽ 3232 | nhẽo 3233 | nhếch 3234 | nhể 3235 | nhễ 3236 | nhệch 3237 | nhện 3238 | nhỉ 3239 | nhỉnh 3240 | nhị 3241 | nhịn 3242 | nhịp 3243 | nhịt 3244 | nhịu 3245 | nhọ 3246 | nhọc 3247 | nhọn 3248 | nhọt 3249 | nhỏ 3250 | nhỏm 3251 | nhỏng 3252 | nhố 3253 | nhối 3254 | nhốn 3255 | nhốt 3256 | nhồi 3257 | nhồm 3258 | nhồn 3259 | nhồng 3260 | nhổ 3261 | nhổm 3262 | nhổn 3263 | nhộn 3264 | nhộng 3265 | nhột 3266 | nhớ 3267 | nhớn 3268 | nhớp 3269 | nhớt 3270 | nhờ 3271 | nhờn 3272 | nhở 3273 | nhởn 3274 | nhỡ 3275 | nhỡn 3276 | nhợ 3277 | nhợt 3278 | nhụ 3279 | nhụa 3280 | nhục 3281 | nhụi 3282 | nhụt 3283 | nhụy 3284 | nhủ 3285 | nhủi 3286 | nhủng 3287 | nhứ 3288 | nhức 3289 | nhứt 3290 | nhừ 3291 | nhử 3292 | những 3293 | nhự 3294 | nhựa 3295 | nhựt 3296 | ni 3297 | nia 3298 | nin 3299 | ninh 3300 | niu 3301 | niêm 3302 | niên 3303 | niêu 3304 | niết 3305 | niềm 3306 | niềng 3307 | niễng 3308 | niệm 3309 | niệu 3310 | no 3311 | noi 3312 | nom 3313 | non 3314 | nong 3315 | noãn 3316 | nu 3317 | nua 3318 | nung 3319 | nuôi 3320 | nuông 3321 | nuối 3322 | nuốt 3323 | nuột 3324 | nà 3325 | nài 3326 | nàn 3327 | nàng 3328 | nành 3329 | nào 3330 | này 3331 | ná 3332 | nác 3333 | nách 3334 | nái 3335 | nám 3336 | nán 3337 | náng 3338 | náo 3339 | nát 3340 | náu 3341 | náy 3342 | nâng 3343 | nâu 3344 | nây 3345 | nã 3346 | não 3347 | nãy 3348 | nè 3349 | nèo 3350 | né 3351 | ném 3352 | nén 3353 | néo 3354 | nép 3355 | nét 3356 | nê 3357 | nêm 3358 | nên 3359 | nêu 3360 | nì 3361 | ních 3362 | nín 3363 | nít 3364 | níu 3365 | nòi 3366 | nòng 3367 | nó 3368 | nóc 3369 | nói 3370 | nón 3371 | nóng 3372 | nót 3373 | nô 3374 | nôi 3375 | nôm 3376 | nôn 3377 | nông 3378 | nõn 3379 | nùi 3380 | nùng 3381 | núc 3382 | núi 3383 | núm 3384 | núng 3385 | núp 3386 | nút 3387 | năm 3388 | năn 3389 | năng 3390 | nĩa 3391 | nũng 3392 | nơ 3393 | nơi 3394 | nơm 3395 | nư 3396 | nưa 3397 | nương 3398 | nước 3399 | nướng 3400 | nườm 3401 | nượp 3402 | nạ 3403 | nạc 3404 | nại 3405 | nạm 3406 | nạn 3407 | nạng 3408 | nạnh 3409 | nạo 3410 | nạp 3411 | nạt 3412 | nạy 3413 | nả 3414 | nải 3415 | nản 3416 | nảo 3417 | nảy 3418 | nấc 3419 | nấm 3420 | nấn 3421 | nấng 3422 | nấp 3423 | nấu 3424 | nấy 3425 | nầm 3426 | nần 3427 | nầy 3428 | nẩy 3429 | nẫn 3430 | nẫng 3431 | nẫu 3432 | nậm 3433 | nập 3434 | nậu 3435 | nậy 3436 | nắc 3437 | nắm 3438 | nắn 3439 | nắng 3440 | nắp 3441 | nằm 3442 | nằng 3443 | nặc 3444 | nặn 3445 | nặng 3446 | nẹ 3447 | nẹp 3448 | nẹt 3449 | nẻ 3450 | nẻo 3451 | nếm 3452 | nến 3453 | nếp 3454 | nết 3455 | nếu 3456 | nề 3457 | nền 3458 | nể 3459 | nệ 3460 | nệm 3461 | nện 3462 | nỉ 3463 | nịch 3464 | nịnh 3465 | nịt 3466 | nịu 3467 | nọ 3468 | nọc 3469 | nọng 3470 | nọt 3471 | nỏ 3472 | nốc 3473 | nối 3474 | nống 3475 | nốt 3476 | nồi 3477 | nồm 3478 | nồng 3479 | nổ 3480 | nổi 3481 | nỗ 3482 | nỗi 3483 | nộ 3484 | nội 3485 | nộm 3486 | nộn 3487 | nộp 3488 | nột 3489 | nớ 3490 | nới 3491 | nớp 3492 | nớt 3493 | nở 3494 | nỡ 3495 | nỡm 3496 | nợ 3497 | nụ 3498 | nục 3499 | nứa 3500 | nức 3501 | nứt 3502 | nửa 3503 | nữ 3504 | nữa 3505 | nự 3506 | nực 3507 | nựng 3508 | o 3509 | oa 3510 | oai 3511 | oan 3512 | oang 3513 | oanh 3514 | oe 3515 | oi 3516 | om 3517 | ong 3518 | oài 3519 | oàng 3520 | oách 3521 | oái 3522 | oán 3523 | oát 3524 | oăm 3525 | oại 3526 | oạp 3527 | oải 3528 | oản 3529 | oắt 3530 | oằn 3531 | oẳng 3532 | oặt 3533 | pa 3534 | pan 3535 | panh 3536 | pha 3537 | phai 3538 | phang 3539 | phanh 3540 | phao 3541 | phau 3542 | phay 3543 | phe 3544 | phen 3545 | pheo 3546 | phi 3547 | phim 3548 | phin 3549 | phinh 3550 | phiu 3551 | phiên 3552 | phiêu 3553 | phiếm 3554 | phiến 3555 | phiếu 3556 | phiền 3557 | phiện 3558 | phiệt 3559 | pho 3560 | phoi 3561 | phong 3562 | phoóc 3563 | phu 3564 | phua 3565 | phui 3566 | phun 3567 | phung 3568 | phuy 3569 | phà 3570 | phàm 3571 | phàn 3572 | phàng 3573 | phành 3574 | phào 3575 | phá 3576 | phác 3577 | phách 3578 | phái 3579 | phán 3580 | pháo 3581 | pháp 3582 | phát 3583 | phân 3584 | phây 3585 | phè 3586 | phèn 3587 | phèng 3588 | phèo 3589 | phéc 3590 | phéng 3591 | phép 3592 | phét 3593 | phê 3594 | phên 3595 | phì 3596 | phình 3597 | phí 3598 | phía 3599 | phích 3600 | phím 3601 | phính 3602 | phò 3603 | phòng 3604 | phó 3605 | phóc 3606 | phóng 3607 | phô 3608 | phôi 3609 | phôn 3610 | phông 3611 | phù 3612 | phùn 3613 | phùng 3614 | phú 3615 | phúc 3616 | phún 3617 | phúng 3618 | phút 3619 | phăm 3620 | phăn 3621 | phăng 3622 | phũ 3623 | phơ 3624 | phơi 3625 | phơn 3626 | phưng 3627 | phương 3628 | phước 3629 | phướn 3630 | phướng 3631 | phường 3632 | phưỡn 3633 | phượng 3634 | phạc 3635 | phạch 3636 | phạm 3637 | phạn 3638 | phạt 3639 | phả 3640 | phải 3641 | phản 3642 | phảng 3643 | phảy 3644 | phấn 3645 | phấp 3646 | phất 3647 | phầm 3648 | phần 3649 | phẩm 3650 | phẩy 3651 | phẫn 3652 | phẫu 3653 | phận 3654 | phập 3655 | phật 3656 | phắc 3657 | phắt 3658 | phẳng 3659 | phế 3660 | phếch 3661 | phết 3662 | phều 3663 | phễu 3664 | phệ 3665 | phệt 3666 | phỉ 3667 | phỉnh 3668 | phị 3669 | phịa 3670 | phịch 3671 | phịu 3672 | phọt 3673 | phỏng 3674 | phố 3675 | phốc 3676 | phối 3677 | phốp 3678 | phồn 3679 | phồng 3680 | phổ 3681 | phổi 3682 | phổng 3683 | phỗng 3684 | phộng 3685 | phới 3686 | phớt 3687 | phờ 3688 | phở 3689 | phởn 3690 | phỡn 3691 | phụ 3692 | phục 3693 | phụng 3694 | phụt 3695 | phủ 3696 | phủi 3697 | phứa 3698 | phức 3699 | phứt 3700 | phừng 3701 | pi 3702 | pom 3703 | pu 3704 | pê 3705 | pít 3706 | pô 3707 | qua 3708 | quai 3709 | quan 3710 | quang 3711 | quanh 3712 | quay 3713 | que 3714 | quen 3715 | queo 3716 | quy 3717 | quyên 3718 | quyến 3719 | quyết 3720 | quyền 3721 | quyềnh 3722 | quyển 3723 | quyện 3724 | quyệt 3725 | quà 3726 | quài 3727 | quàn 3728 | quàng 3729 | quành 3730 | quào 3731 | quá 3732 | quác 3733 | quách 3734 | quái 3735 | quán 3736 | quáng 3737 | quánh 3738 | quát 3739 | quân 3740 | quây 3741 | quãng 3742 | què 3743 | quèn 3744 | quèo 3745 | quéo 3746 | quét 3747 | quê 3748 | quên 3749 | quý 3750 | quýnh 3751 | quýt 3752 | quăn 3753 | quăng 3754 | quơ 3755 | quạ 3756 | quạch 3757 | quại 3758 | quạng 3759 | quạnh 3760 | quạt 3761 | quạu 3762 | quả 3763 | quản 3764 | quảng 3765 | quảy 3766 | quấn 3767 | quất 3768 | quấy 3769 | quần 3770 | quầng 3771 | quầy 3772 | quẩn 3773 | quẩng 3774 | quẩy 3775 | quẫn 3776 | quẫy 3777 | quận 3778 | quật 3779 | quậy 3780 | quắc 3781 | quắm 3782 | quắn 3783 | quắp 3784 | quắt 3785 | quằn 3786 | quẳng 3787 | quặc 3788 | quặm 3789 | quặn 3790 | quặng 3791 | quặp 3792 | quặt 3793 | quẹo 3794 | quẹt 3795 | quẻ 3796 | quẽ 3797 | quế 3798 | quết 3799 | quều 3800 | quệ 3801 | quện 3802 | quệt 3803 | quốc 3804 | quờ 3805 | quở 3806 | quỳ 3807 | quỳnh 3808 | quỵ 3809 | quỵt 3810 | quỷ 3811 | quỹ 3812 | ra 3813 | rai 3814 | ram 3815 | ran 3816 | rang 3817 | ranh 3818 | rao 3819 | rau 3820 | ray 3821 | re 3822 | ren 3823 | reo 3824 | ri 3825 | ria 3826 | rim 3827 | rin 3828 | rinh 3829 | riu 3830 | riêng 3831 | riêu 3832 | riết 3833 | riếu 3834 | riềm 3835 | ro 3836 | roa 3837 | roi 3838 | rong 3839 | ru 3840 | rua 3841 | rui 3842 | rum 3843 | run 3844 | rung 3845 | ruôn 3846 | ruốc 3847 | ruối 3848 | ruồi 3849 | ruồng 3850 | ruổi 3851 | ruỗng 3852 | ruộm 3853 | ruộng 3854 | ruột 3855 | rà 3856 | rài 3857 | ràn 3858 | ràng 3859 | rành 3860 | rào 3861 | rày 3862 | rá 3863 | rác 3864 | rách 3865 | rái 3866 | rám 3867 | rán 3868 | ráng 3869 | ráo 3870 | ráp 3871 | rát 3872 | ráu 3873 | ráy 3874 | râm 3875 | rân 3876 | râu 3877 | rây 3878 | rã 3879 | rãi 3880 | rãnh 3881 | rão 3882 | rè 3883 | rèm 3884 | rèn 3885 | ré 3886 | rén 3887 | réo 3888 | rét 3889 | rê 3890 | rên 3891 | rêu 3892 | rì 3893 | rìa 3894 | rình 3895 | rìu 3896 | rí 3897 | rích 3898 | rít 3899 | ríu 3900 | rò 3901 | ròi 3902 | ròn 3903 | ròng 3904 | ró 3905 | róc 3906 | rói 3907 | róm 3908 | rón 3909 | róng 3910 | rót 3911 | rô 3912 | rôm 3913 | rông 3914 | rõ 3915 | rõi 3916 | rù 3917 | rùa 3918 | rùm 3919 | rùng 3920 | rú 3921 | rúc 3922 | rúm 3923 | rún 3924 | rúng 3925 | rúp 3926 | rút 3927 | răm 3928 | răn 3929 | răng 3930 | rĩ 3931 | rũ 3932 | rũa 3933 | rơ 3934 | rơi 3935 | rơm 3936 | rơn 3937 | rưa 3938 | rưng 3939 | rươi 3940 | rương 3941 | rước 3942 | rưới 3943 | rướm 3944 | rướn 3945 | rười 3946 | rườm 3947 | rường 3948 | rưởi 3949 | rưỡi 3950 | rượi 3951 | rượn 3952 | rượt 3953 | rượu 3954 | rạ 3955 | rạc 3956 | rạch 3957 | rạm 3958 | rạn 3959 | rạng 3960 | rạo 3961 | rạp 3962 | rạt 3963 | rả 3964 | rải 3965 | rảnh 3966 | rảo 3967 | rảy 3968 | rấm 3969 | rất 3970 | rầm 3971 | rần 3972 | rầu 3973 | rầy 3974 | rẩm 3975 | rẩy 3976 | rẫm 3977 | rẫy 3978 | rậm 3979 | rận 3980 | rập 3981 | rật 3982 | rắc 3983 | rắm 3984 | rắn 3985 | rắp 3986 | rắt 3987 | rằm 3988 | rằn 3989 | rằng 3990 | rặn 3991 | rặng 3992 | rặt 3993 | rẻ 3994 | rẻng 3995 | rẻo 3996 | rẽ 3997 | rế 3998 | rếch 3999 | rến 4000 | rết 4001 | rề 4002 | rền 4003 | rềnh 4004 | rều 4005 | rể 4006 | rễ 4007 | rệ 4008 | rệp 4009 | rệt 4010 | rệu 4011 | rỉ 4012 | rỉa 4013 | rỉnh 4014 | rị 4015 | rịa 4016 | rịch 4017 | rịn 4018 | rịp 4019 | rịt 4020 | rọ 4021 | rọc 4022 | rọi 4023 | rọt 4024 | rỏ 4025 | rỏi 4026 | rỏn 4027 | rốc 4028 | rối 4029 | rốn 4030 | rống 4031 | rốt 4032 | rồ 4033 | rồi 4034 | rồng 4035 | rổ 4036 | rỗ 4037 | rỗi 4038 | rỗng 4039 | rộ 4040 | rộc 4041 | rộm 4042 | rộn 4043 | rộng 4044 | rộp 4045 | rớ 4046 | rớm 4047 | rớt 4048 | rờ 4049 | rời 4050 | rờn 4051 | rở 4052 | rởm 4053 | rỡ 4054 | rợ 4055 | rợi 4056 | rợn 4057 | rợp 4058 | rụa 4059 | rục 4060 | rụi 4061 | rụm 4062 | rụng 4063 | rụt 4064 | rủ 4065 | rủa 4066 | rủi 4067 | rủn 4068 | rủng 4069 | rứa 4070 | rức 4071 | rứt 4072 | rừng 4073 | rửa 4074 | rữa 4075 | rựa 4076 | rực 4077 | sa 4078 | sai 4079 | sam 4080 | san 4081 | sang 4082 | sanh 4083 | sao 4084 | sau 4085 | say 4086 | se 4087 | sen 4088 | seo 4089 | si 4090 | sim 4091 | sin 4092 | sinh 4093 | siêng 4094 | siêu 4095 | siết 4096 | so 4097 | soa 4098 | soi 4099 | son 4100 | song 4101 | soong 4102 | soài 4103 | soàn 4104 | soái 4105 | soán 4106 | soát 4107 | soóc 4108 | soạn 4109 | soạng 4110 | soạt 4111 | su 4112 | sui 4113 | sum 4114 | sun 4115 | sung 4116 | suy 4117 | suyển 4118 | suyễn 4119 | suê 4120 | suôn 4121 | suông 4122 | suýt 4123 | suất 4124 | suối 4125 | suốt 4126 | suồng 4127 | suỵt 4128 | sà 4129 | sài 4130 | sàm 4131 | sàn 4132 | sàng 4133 | sành 4134 | sào 4135 | sá 4136 | sác 4137 | sách 4138 | sái 4139 | sám 4140 | sán 4141 | sáng 4142 | sánh 4143 | sáo 4144 | sáp 4145 | sát 4146 | sáu 4147 | sâm 4148 | sân 4149 | sâu 4150 | sây 4151 | sã 4152 | sãi 4153 | sè 4154 | sèo 4155 | séc 4156 | sém 4157 | sét 4158 | sê 4159 | sên 4160 | sênh 4161 | sì 4162 | sình 4163 | sính 4164 | sít 4165 | sò 4166 | sòi 4167 | sòm 4168 | sòn 4169 | sòng 4170 | sóc 4171 | sói 4172 | són 4173 | sóng 4174 | sót 4175 | sô 4176 | sôi 4177 | sông 4178 | sõi 4179 | sõng 4180 | sù 4181 | sùi 4182 | sùm 4183 | sùng 4184 | sú 4185 | súc 4186 | sún 4187 | súng 4188 | súp 4189 | sút 4190 | súy 4191 | săm 4192 | săn 4193 | săng 4194 | sĩ 4195 | sũng 4196 | sơ 4197 | sơm 4198 | sơn 4199 | sư 4200 | sưa 4201 | sưng 4202 | sưu 4203 | sương 4204 | sướng 4205 | sướt 4206 | sườn 4207 | sưởi 4208 | sượng 4209 | sượt 4210 | sạ 4211 | sạch 4212 | sạm 4213 | sạn 4214 | sạo 4215 | sạp 4216 | sạt 4217 | sả 4218 | sải 4219 | sản 4220 | sảng 4221 | sảnh 4222 | sảo 4223 | sảy 4224 | sấm 4225 | sấn 4226 | sấp 4227 | sất 4228 | sấu 4229 | sấy 4230 | sầm 4231 | sần 4232 | sầu 4233 | sầy 4234 | sẩm 4235 | sẩn 4236 | sẩy 4237 | sẫm 4238 | sậm 4239 | sập 4240 | sậu 4241 | sậy 4242 | sắc 4243 | sắm 4244 | sắn 4245 | sắng 4246 | sắp 4247 | sắt 4248 | sằng 4249 | sẵn 4250 | sặc 4251 | sặt 4252 | sẹo 4253 | sẻ 4254 | sẻn 4255 | sẽ 4256 | sến 4257 | sếp 4258 | sếu 4259 | sề 4260 | sền 4261 | sểnh 4262 | sệ 4263 | sệt 4264 | sỉ 4265 | sỉa 4266 | sị 4267 | sịa 4268 | sịt 4269 | sọ 4270 | sọc 4271 | sọm 4272 | sọt 4273 | sỏ 4274 | sỏi 4275 | số 4276 | sốc 4277 | sống 4278 | sốp 4279 | sốt 4280 | sồ 4281 | sồi 4282 | sồn 4283 | sồng 4284 | sổ 4285 | sổi 4286 | sổng 4287 | sỗ 4288 | sộ 4289 | sộp 4290 | sột 4291 | sớ 4292 | sới 4293 | sớm 4294 | sớn 4295 | sớt 4296 | sờ 4297 | sờn 4298 | sở 4299 | sởi 4300 | sởn 4301 | sỡ 4302 | sợ 4303 | sợi 4304 | sụ 4305 | sụa 4306 | sục 4307 | sụm 4308 | sụn 4309 | sụp 4310 | sụt 4311 | sủa 4312 | sủi 4313 | sủng 4314 | sứ 4315 | sứa 4316 | sức 4317 | sứt 4318 | sừng 4319 | sử 4320 | sửa 4321 | sửng 4322 | sửu 4323 | sữa 4324 | sững 4325 | sự 4326 | sực 4327 | ta 4328 | tai 4329 | tam 4330 | tan 4331 | tang 4332 | tanh 4333 | tao 4334 | tau 4335 | tay 4336 | te 4337 | tem 4338 | ten 4339 | teng 4340 | teo 4341 | tha 4342 | thai 4343 | tham 4344 | than 4345 | thang 4346 | thanh 4347 | thao 4348 | thau 4349 | thay 4350 | the 4351 | then 4352 | theo 4353 | thi 4354 | thia 4355 | thin 4356 | thinh 4357 | thiu 4358 | thiêm 4359 | thiên 4360 | thiêng 4361 | thiêu 4362 | thiếc 4363 | thiếp 4364 | thiết 4365 | thiếu 4366 | thiền 4367 | thiềng 4368 | thiều 4369 | thiểm 4370 | thiển 4371 | thiểu 4372 | thiện 4373 | thiệp 4374 | thiệt 4375 | thiệu 4376 | tho 4377 | thoa 4378 | thoai 4379 | thoang 4380 | thoi 4381 | thom 4382 | thon 4383 | thong 4384 | thoái 4385 | thoán 4386 | thoáng 4387 | thoát 4388 | thoăn 4389 | thoại 4390 | thoạt 4391 | thoải 4392 | thoảng 4393 | thoắng 4394 | thoắt 4395 | thu 4396 | thua 4397 | thui 4398 | thum 4399 | thun 4400 | thung 4401 | thuyên 4402 | thuyết 4403 | thuyền 4404 | thuê 4405 | thuôn 4406 | thuần 4407 | thuẫn 4408 | thuận 4409 | thuật 4410 | thuế 4411 | thuốc 4412 | thuốn 4413 | thuồng 4414 | thuổng 4415 | thuộc 4416 | thuộm 4417 | thuở 4418 | thy 4419 | thà 4420 | thài 4421 | thành 4422 | thào 4423 | thày 4424 | thá 4425 | thác 4426 | thách 4427 | thái 4428 | thám 4429 | thán 4430 | tháng 4431 | thánh 4432 | tháo 4433 | tháp 4434 | thát 4435 | thâm 4436 | thân 4437 | thâu 4438 | thây 4439 | thãi 4440 | thè 4441 | thèm 4442 | thèn 4443 | thèo 4444 | thé 4445 | thép 4446 | thét 4447 | thê 4448 | thêm 4449 | thênh 4450 | thêu 4451 | thì 4452 | thìa 4453 | thìn 4454 | thình 4455 | thí 4456 | thía 4457 | thích 4458 | thím 4459 | thín 4460 | thính 4461 | thít 4462 | thò 4463 | thòi 4464 | thòm 4465 | thòng 4466 | thó 4467 | thóa 4468 | thóc 4469 | thói 4470 | thóp 4471 | thót 4472 | thô 4473 | thôi 4474 | thôn 4475 | thông 4476 | thõa 4477 | thõng 4478 | thù 4479 | thùa 4480 | thùi 4481 | thùm 4482 | thùng 4483 | thùy 4484 | thú 4485 | thúc 4486 | thúi 4487 | thúng 4488 | thút 4489 | thúy 4490 | thăm 4491 | thăn 4492 | thăng 4493 | thũng 4494 | thơ 4495 | thơi 4496 | thơm 4497 | thơn 4498 | thư 4499 | thưa 4500 | thưng 4501 | thương 4502 | thước 4503 | thướt 4504 | thườn 4505 | thường 4506 | thưởng 4507 | thược 4508 | thượng 4509 | thượt 4510 | thạc 4511 | thạch 4512 | thạnh 4513 | thạo 4514 | thạp 4515 | thả 4516 | thải 4517 | thảm 4518 | thản 4519 | thảng 4520 | thảnh 4521 | thảo 4522 | thảy 4523 | thấm 4524 | thấp 4525 | thất 4526 | thấu 4527 | thấy 4528 | thầm 4529 | thần 4530 | thầu 4531 | thầy 4532 | thẩm 4533 | thẩn 4534 | thẩu 4535 | thẫm 4536 | thẫn 4537 | thậm 4538 | thận 4539 | thập 4540 | thật 4541 | thắc 4542 | thắm 4543 | thắn 4544 | thắng 4545 | thắp 4546 | thắt 4547 | thằn 4548 | thằng 4549 | thẳm 4550 | thẳng 4551 | thặng 4552 | thẹn 4553 | thẹo 4554 | thẻ 4555 | thẽ 4556 | thế 4557 | thếch 4558 | thếp 4559 | thết 4560 | thề 4561 | thềm 4562 | thều 4563 | thể 4564 | thểu 4565 | thệ 4566 | thỉ 4567 | thỉnh 4568 | thỉu 4569 | thị 4570 | thịch 4571 | thịnh 4572 | thịt 4573 | thọ 4574 | thọc 4575 | thọt 4576 | thỏ 4577 | thỏa 4578 | thỏi 4579 | thỏm 4580 | thố 4581 | thốc 4582 | thối 4583 | thốn 4584 | thống 4585 | thốt 4586 | thồ 4587 | thồm 4588 | thổ 4589 | thổi 4590 | thổn 4591 | thộn 4592 | thột 4593 | thớ 4594 | thới 4595 | thớm 4596 | thớt 4597 | thờ 4598 | thời 4599 | thở 4600 | thợ 4601 | thụ 4602 | thục 4603 | thụi 4604 | thụng 4605 | thụp 4606 | thụt 4607 | thụy 4608 | thủ 4609 | thủa 4610 | thủi 4611 | thủm 4612 | thủng 4613 | thủy 4614 | thứ 4615 | thức 4616 | thừ 4617 | thừa 4618 | thừng 4619 | thử 4620 | thửa 4621 | thững 4622 | thự 4623 | thực 4624 | ti 4625 | tia 4626 | tim 4627 | tin 4628 | tinh 4629 | tiu 4630 | tiêm 4631 | tiên 4632 | tiêng 4633 | tiêu 4634 | tiếc 4635 | tiếm 4636 | tiến 4637 | tiếng 4638 | tiếp 4639 | tiết 4640 | tiếu 4641 | tiềm 4642 | tiền 4643 | tiềng 4644 | tiều 4645 | tiểu 4646 | tiễn 4647 | tiễu 4648 | tiệc 4649 | tiệm 4650 | tiện 4651 | tiệp 4652 | tiệt 4653 | to 4654 | toa 4655 | toan 4656 | toang 4657 | toanh 4658 | toe 4659 | toi 4660 | tom 4661 | ton 4662 | tong 4663 | toong 4664 | toài 4665 | toàn 4666 | toàng 4667 | toác 4668 | toái 4669 | toán 4670 | toáng 4671 | toát 4672 | toáy 4673 | toét 4674 | toòng 4675 | toạc 4676 | toại 4677 | toản 4678 | toẹt 4679 | tra 4680 | trai 4681 | trang 4682 | tranh 4683 | trao 4684 | trau 4685 | tre 4686 | treo 4687 | tri 4688 | trinh 4689 | triêng 4690 | triết 4691 | triền 4692 | triều 4693 | triển 4694 | triện 4695 | triệt 4696 | triệu 4697 | tro 4698 | trom 4699 | trong 4700 | tru 4701 | trui 4702 | trung 4703 | truy 4704 | truyền 4705 | truyện 4706 | truân 4707 | truất 4708 | truồng 4709 | trà 4710 | tràm 4711 | tràn 4712 | tràng 4713 | trành 4714 | trào 4715 | tràu 4716 | trá 4717 | trác 4718 | trách 4719 | trái 4720 | trám 4721 | trán 4722 | tráng 4723 | tránh 4724 | tráo 4725 | tráp 4726 | trát 4727 | trâm 4728 | trân 4729 | trâng 4730 | trâu 4731 | trây 4732 | trã 4733 | trèm 4734 | trèo 4735 | tréo 4736 | trét 4737 | trê 4738 | trên 4739 | trêu 4740 | trì 4741 | trình 4742 | trìu 4743 | trí 4744 | trích 4745 | trít 4746 | trò 4747 | tròm 4748 | tròn 4749 | tròng 4750 | tróc 4751 | trói 4752 | trót 4753 | trôi 4754 | trôn 4755 | trông 4756 | trù 4757 | trùi 4758 | trùm 4759 | trùn 4760 | trùng 4761 | trú 4762 | trúc 4763 | trúm 4764 | trúng 4765 | trút 4766 | trăm 4767 | trăn 4768 | trăng 4769 | trĩ 4770 | trĩnh 4771 | trĩu 4772 | trũi 4773 | trũng 4774 | trơ 4775 | trơi 4776 | trơn 4777 | trưa 4778 | trưng 4779 | trương 4780 | trước 4781 | trướng 4782 | trườn 4783 | trường 4784 | trưởng 4785 | trượng 4786 | trượt 4787 | trạc 4788 | trạch 4789 | trại 4790 | trạm 4791 | trạng 4792 | trạnh 4793 | trạo 4794 | trả 4795 | trải 4796 | trảm 4797 | trảng 4798 | trảo 4799 | trảu 4800 | trảy 4801 | trấn 4802 | trấp 4803 | trấu 4804 | trầm 4805 | trần 4806 | trầu 4807 | trầy 4808 | trẩu 4809 | trẩy 4810 | trận 4811 | trập 4812 | trật 4813 | trắc 4814 | trắm 4815 | trắng 4816 | trằm 4817 | trằn 4818 | trặc 4819 | trặn 4820 | trẹ 4821 | trẹo 4822 | trẹt 4823 | trẻ 4824 | trẻo 4825 | trẽn 4826 | trề 4827 | trển 4828 | trễ 4829 | trệ 4830 | trệch 4831 | trệt 4832 | trệu 4833 | trỉa 4834 | trị 4835 | trịch 4836 | trịnh 4837 | trọ 4838 | trọc 4839 | trọi 4840 | trọn 4841 | trọng 4842 | trọt 4843 | trỏ 4844 | trỏng 4845 | trố 4846 | trốc 4847 | trối 4848 | trốn 4849 | trống 4850 | trốt 4851 | trồ 4852 | trồi 4853 | trồng 4854 | trổ 4855 | trổng 4856 | trỗ 4857 | trỗi 4858 | trộ 4859 | trội 4860 | trộm 4861 | trộn 4862 | trớ 4863 | trớn 4864 | trờ 4865 | trời 4866 | trở 4867 | trợ 4868 | trợn 4869 | trợt 4870 | trụ 4871 | trụa 4872 | trục 4873 | trụi 4874 | trụng 4875 | trụt 4876 | trụy 4877 | trủ 4878 | trứ 4879 | trứng 4880 | trừ 4881 | trừng 4882 | trừu 4883 | trữ 4884 | trự 4885 | trực 4886 | tu 4887 | tua 4888 | tui 4889 | tum 4890 | tun 4891 | tung 4892 | tuy 4893 | tuya 4894 | tuyn 4895 | tuyên 4896 | tuyến 4897 | tuyết 4898 | tuyền 4899 | tuyển 4900 | tuyệt 4901 | tuân 4902 | tuôn 4903 | tuông 4904 | tuýp 4905 | tuýt 4906 | tuấn 4907 | tuất 4908 | tuần 4909 | tuẫn 4910 | tuế 4911 | tuếch 4912 | tuềnh 4913 | tuệ 4914 | tuốc 4915 | tuốt 4916 | tuồi 4917 | tuồn 4918 | tuồng 4919 | tuổi 4920 | tuộc 4921 | tuột 4922 | ty 4923 | tà 4924 | tài 4925 | tàm 4926 | tàn 4927 | tàng 4928 | tành 4929 | tào 4930 | tàu 4931 | tày 4932 | tá 4933 | tác 4934 | tách 4935 | tái 4936 | tám 4937 | tán 4938 | táng 4939 | tánh 4940 | táo 4941 | táp 4942 | tát 4943 | táu 4944 | táy 4945 | tâm 4946 | tân 4947 | tâng 4948 | tâu 4949 | tây 4950 | tã 4951 | tãi 4952 | tè 4953 | tèm 4954 | tèo 4955 | té 4956 | tém 4957 | tép 4958 | tét 4959 | tê 4960 | têm 4961 | tên 4962 | tênh 4963 | têu 4964 | tì 4965 | tìm 4966 | tình 4967 | tí 4968 | tía 4969 | tích 4970 | tím 4971 | tín 4972 | tính 4973 | típ 4974 | tít 4975 | tíu 4976 | tò 4977 | tòa 4978 | tòe 4979 | tòi 4980 | tòm 4981 | tòn 4982 | tòng 4983 | tó 4984 | tóa 4985 | tóc 4986 | tóe 4987 | tói 4988 | tóm 4989 | tóp 4990 | tót 4991 | tô 4992 | tôi 4993 | tôm 4994 | tôn 4995 | tông 4996 | tõm 4997 | tù 4998 | tùm 4999 | tùng 5000 | tùy 5001 | tú 5002 | túa 5003 | túc 5004 | túi 5005 | túm 5006 | túng 5007 | túp 5008 | tút 5009 | túy 5010 | tăm 5011 | tăn 5012 | tăng 5013 | tĩnh 5014 | tĩu 5015 | tơ 5016 | tơi 5017 | tư 5018 | tưa 5019 | tưng 5020 | tươi 5021 | tươm 5022 | tương 5023 | tước 5024 | tưới 5025 | tướng 5026 | tướp 5027 | tướt 5028 | tường 5029 | tưởi 5030 | tưởng 5031 | tược 5032 | tượng 5033 | tạ 5034 | tạc 5035 | tạch 5036 | tại 5037 | tạm 5038 | tạng 5039 | tạnh 5040 | tạo 5041 | tạp 5042 | tạt 5043 | tả 5044 | tải 5045 | tản 5046 | tảng 5047 | tảo 5048 | tấc 5049 | tấm 5050 | tấn 5051 | tấp 5052 | tất 5053 | tấu 5054 | tấy 5055 | tầm 5056 | tần 5057 | tầng 5058 | tầu 5059 | tầy 5060 | tẩm 5061 | tẩn 5062 | tẩu 5063 | tẩy 5064 | tậm 5065 | tận 5066 | tập 5067 | tật 5068 | tậu 5069 | tắc 5070 | tắm 5071 | tắn 5072 | tắp 5073 | tắt 5074 | tằm 5075 | tằn 5076 | tằng 5077 | tặc 5078 | tặng 5079 | tẹo 5080 | tẹt 5081 | tẻ 5082 | tẻo 5083 | tẽ 5084 | tẽn 5085 | tế 5086 | tếch 5087 | tết 5088 | tếu 5089 | tề 5090 | tể 5091 | tểnh 5092 | tễ 5093 | tễnh 5094 | tệ 5095 | tệp 5096 | tỉ 5097 | tỉa 5098 | tỉm 5099 | tỉnh 5100 | tị 5101 | tịa 5102 | tịch 5103 | tịnh 5104 | tịt 5105 | tịu 5106 | tọa 5107 | tọc 5108 | tọp 5109 | tọt 5110 | tỏ 5111 | tỏa 5112 | tỏi 5113 | tỏng 5114 | tố 5115 | tốc 5116 | tối 5117 | tốn 5118 | tống 5119 | tốp 5120 | tốt 5121 | tồ 5122 | tồi 5123 | tồn 5124 | tồng 5125 | tổ 5126 | tổn 5127 | tổng 5128 | tộ 5129 | tộc 5130 | tội 5131 | tột 5132 | tớ 5133 | tới 5134 | tớn 5135 | tờ 5136 | tời 5137 | tở 5138 | tởm 5139 | tởn 5140 | tợn 5141 | tợp 5142 | tụ 5143 | tục 5144 | tụi 5145 | tụm 5146 | tụng 5147 | tụt 5148 | tụy 5149 | tủ 5150 | tủa 5151 | tủi 5152 | tủm 5153 | tủn 5154 | tủy 5155 | tứ 5156 | tứa 5157 | tức 5158 | từ 5159 | từng 5160 | tử 5161 | tửng 5162 | tửu 5163 | tự 5164 | tựa 5165 | tựu 5166 | u 5167 | ui 5168 | um 5169 | un 5170 | ung 5171 | uy 5172 | uyên 5173 | uyển 5174 | uôm 5175 | uất 5176 | uẩn 5177 | uế 5178 | uể 5179 | uốn 5180 | uống 5181 | uổng 5182 | uột 5183 | uỳnh 5184 | uỵch 5185 | va 5186 | vai 5187 | van 5188 | vang 5189 | vanh 5190 | vao 5191 | vay 5192 | ve 5193 | ven 5194 | veo 5195 | vi 5196 | vin 5197 | vinh 5198 | viêm 5199 | viên 5200 | viếng 5201 | viết 5202 | viền 5203 | viển 5204 | viễn 5205 | việc 5206 | viện 5207 | việt 5208 | vo 5209 | voan 5210 | voi 5211 | von 5212 | vong 5213 | vu 5214 | vua 5215 | vui 5216 | vun 5217 | vung 5218 | vuông 5219 | vuốt 5220 | vuột 5221 | vy 5222 | và 5223 | vài 5224 | vàm 5225 | vàn 5226 | vàng 5227 | vành 5228 | vào 5229 | vày 5230 | vá 5231 | vác 5232 | vách 5233 | vái 5234 | ván 5235 | váng 5236 | vánh 5237 | váo 5238 | váp 5239 | vát 5240 | váy 5241 | vâm 5242 | vân 5243 | vâng 5244 | vây 5245 | vã 5246 | vãi 5247 | vãng 5248 | vãnh 5249 | vè 5250 | vèo 5251 | vé 5252 | véc 5253 | vén 5254 | véo 5255 | vét 5256 | vê 5257 | vênh 5258 | vêu 5259 | vì 5260 | ví 5261 | vía 5262 | vích 5263 | vít 5264 | víu 5265 | vò 5266 | vòi 5267 | vòm 5268 | vòn 5269 | vòng 5270 | vó 5271 | vóc 5272 | vói 5273 | vón 5274 | vót 5275 | vô 5276 | vôi 5277 | vôn 5278 | vông 5279 | võ 5280 | võng 5281 | vù 5282 | vùa 5283 | vùi 5284 | vùn 5285 | vùng 5286 | vú 5287 | vút 5288 | văn 5289 | văng 5290 | vĩ 5291 | vĩnh 5292 | vũ 5293 | vũng 5294 | vơ 5295 | vơi 5296 | vươn 5297 | vương 5298 | vướng 5299 | vườn 5300 | vưởng 5301 | vược 5302 | vượn 5303 | vượng 5304 | vượt 5305 | vạ 5306 | vạc 5307 | vạch 5308 | vại 5309 | vạm 5310 | vạn 5311 | vạng 5312 | vạnh 5313 | vạt 5314 | vạy 5315 | vả 5316 | vải 5317 | vảng 5318 | vảy 5319 | vấn 5320 | vấp 5321 | vất 5322 | vấu 5323 | vấy 5324 | vần 5325 | vầng 5326 | vầu 5327 | vầy 5328 | vẩn 5329 | vẩu 5330 | vẩy 5331 | vẫn 5332 | vẫy 5333 | vận 5334 | vập 5335 | vật 5336 | vậy 5337 | vắc 5338 | vắn 5339 | vắng 5340 | vắt 5341 | vằm 5342 | vằn 5343 | vằng 5344 | vẳng 5345 | vặc 5346 | vặn 5347 | vặt 5348 | vẹm 5349 | vẹn 5350 | vẹo 5351 | vẹt 5352 | vẻ 5353 | vẻn 5354 | vẻo 5355 | vẽ 5356 | vế 5357 | vếch 5358 | vết 5359 | về 5360 | vều 5361 | vểnh 5362 | vệ 5363 | vện 5364 | vệt 5365 | vỉ 5366 | vỉa 5367 | vị 5368 | vịn 5369 | vịnh 5370 | vịt 5371 | vọ 5372 | vọc 5373 | vọi 5374 | vọng 5375 | vọp 5376 | vọt 5377 | vỏ 5378 | vỏn 5379 | vố 5380 | vốc 5381 | vối 5382 | vốn 5383 | vống 5384 | vồ 5385 | vồn 5386 | vồng 5387 | vổng 5388 | vỗ 5389 | vội 5390 | vớ 5391 | với 5392 | vớt 5393 | vờ 5394 | vời 5395 | vờn 5396 | vở 5397 | vởn 5398 | vỡ 5399 | vợ 5400 | vợi 5401 | vợt 5402 | vụ 5403 | vục 5404 | vụn 5405 | vụng 5406 | vụt 5407 | vức 5408 | vứt 5409 | vừa 5410 | vừng 5411 | vữa 5412 | vững 5413 | vựa 5414 | vực 5415 | vựng 5416 | xa 5417 | xam 5418 | xan 5419 | xang 5420 | xanh 5421 | xao 5422 | xay 5423 | xe 5424 | xem 5425 | xen 5426 | xeo 5427 | xi 5428 | xin 5429 | xinh 5430 | xiêm 5431 | xiên 5432 | xiêu 5433 | xiếc 5434 | xiết 5435 | xiềng 5436 | xiểng 5437 | xo 5438 | xoa 5439 | xoan 5440 | xoang 5441 | xoay 5442 | xoe 5443 | xoen 5444 | xoi 5445 | xom 5446 | xon 5447 | xong 5448 | xoong 5449 | xoài 5450 | xoàm 5451 | xoàn 5452 | xoàng 5453 | xoành 5454 | xoáy 5455 | xoèn 5456 | xoét 5457 | xoăn 5458 | xoạc 5459 | xoạch 5460 | xoạt 5461 | xoảng 5462 | xoắn 5463 | xoẹt 5464 | xu 5465 | xua 5466 | xui 5467 | xum 5468 | xun 5469 | xung 5470 | xuyên 5471 | xuyến 5472 | xuyết 5473 | xuân 5474 | xuê 5475 | xuôi 5476 | xuýt 5477 | xuất 5478 | xuẩn 5479 | xuề 5480 | xuềnh 5481 | xuể 5482 | xuống 5483 | xuồng 5484 | xuộm 5485 | xuỵt 5486 | xà 5487 | xài 5488 | xàng 5489 | xào 5490 | xá 5491 | xác 5492 | xách 5493 | xái 5494 | xám 5495 | xán 5496 | xáng 5497 | xáo 5498 | xáp 5499 | xát 5500 | xâm 5501 | xâu 5502 | xây 5503 | xã 5504 | xè 5505 | xèn 5506 | xèng 5507 | xèo 5508 | xé 5509 | xén 5510 | xéo 5511 | xép 5512 | xét 5513 | xê 5514 | xên 5515 | xênh 5516 | xì 5517 | xìa 5518 | xình 5519 | xìu 5520 | xí 5521 | xía 5522 | xích 5523 | xính 5524 | xít 5525 | xíu 5526 | xòa 5527 | xòe 5528 | xó 5529 | xóa 5530 | xóc 5531 | xói 5532 | xóm 5533 | xón 5534 | xót 5535 | xô 5536 | xôi 5537 | xôm 5538 | xôn 5539 | xông 5540 | xõa 5541 | xõng 5542 | xù 5543 | xùi 5544 | xùm 5545 | xùy 5546 | xú 5547 | xúc 5548 | xúi 5549 | xúm 5550 | xúng 5551 | xút 5552 | xúy 5553 | xăm 5554 | xăng 5555 | xĩnh 5556 | xơ 5557 | xơi 5558 | xưa 5559 | xưng 5560 | xương 5561 | xước 5562 | xướng 5563 | xường 5564 | xưởng 5565 | xược 5566 | xạ 5567 | xạc 5568 | xạch 5569 | xạm 5570 | xạo 5571 | xả 5572 | xảm 5573 | xảo 5574 | xảy 5575 | xấc 5576 | xấp 5577 | xấu 5578 | xầm 5579 | xẩm 5580 | xẩu 5581 | xẩy 5582 | xập 5583 | xắc 5584 | xắn 5585 | xắp 5586 | xắt 5587 | xằng 5588 | xẵng 5589 | xẹo 5590 | xẹp 5591 | xẹt 5592 | xẻ 5593 | xẻn 5594 | xẻng 5595 | xẻo 5596 | xế 5597 | xếch 5598 | xếp 5599 | xề 5600 | xềnh 5601 | xệ 5602 | xệch 5603 | xệt 5604 | xỉ 5605 | xỉa 5606 | xỉn 5607 | xỉnh 5608 | xỉu 5609 | xị 5610 | xịt 5611 | xịu 5612 | xọ 5613 | xọc 5614 | xọp 5615 | xỏ 5616 | xố 5617 | xốc 5618 | xối 5619 | xốn 5620 | xống 5621 | xốp 5622 | xốt 5623 | xồ 5624 | xồm 5625 | xồn 5626 | xồng 5627 | xổ 5628 | xổi 5629 | xổm 5630 | xổng 5631 | xộc 5632 | xộn 5633 | xộp 5634 | xớ 5635 | xới 5636 | xớt 5637 | xờ 5638 | xở 5639 | xởi 5640 | xụ 5641 | xục 5642 | xụi 5643 | xụp 5644 | xủng 5645 | xứ 5646 | xức 5647 | xứng 5648 | xừ 5649 | xừng 5650 | xử 5651 | xửa 5652 | xửng 5653 | xự 5654 | xực 5655 | y 5656 | yên 5657 | yêng 5658 | yêu 5659 | yếm 5660 | yến 5661 | yết 5662 | yếu 5663 | yểm 5664 | yểng 5665 | yểu 5666 | à 5667 | ào 5668 | á 5669 | ác 5670 | ách 5671 | ái 5672 | ám 5673 | án 5674 | áng 5675 | ánh 5676 | áo 5677 | áp 5678 | át 5679 | áy 5680 | âm 5681 | ân 5682 | âu 5683 | ã 5684 | è 5685 | èo 5686 | é 5687 | éc 5688 | ém 5689 | én 5690 | éo 5691 | ép 5692 | ét 5693 | ê 5694 | êm 5695 | ì 5696 | ình 5697 | í 5698 | ích 5699 | ín 5700 | ít 5701 | òa 5702 | òng 5703 | ó 5704 | óc 5705 | óe 5706 | ói 5707 | óng 5708 | óp 5709 | ót 5710 | ô 5711 | ôi 5712 | ôm 5713 | ôn 5714 | ông 5715 | õng 5716 | ù 5717 | ùa 5718 | ùm 5719 | ùn 5720 | ùng 5721 | ú 5722 | úa 5723 | úc 5724 | úi 5725 | úm 5726 | úng 5727 | úp 5728 | út 5729 | úy 5730 | ý 5731 | ăm 5732 | ăn 5733 | ăng 5734 | đa 5735 | đai 5736 | đam 5737 | đan 5738 | đang 5739 | đanh 5740 | đao 5741 | đau 5742 | đay 5743 | đe 5744 | đem 5745 | đen 5746 | đeo 5747 | đi 5748 | đin 5749 | đinh 5750 | điêm 5751 | điên 5752 | điêng 5753 | điêu 5754 | điếc 5755 | điếm 5756 | điến 5757 | điếng 5758 | điếu 5759 | điềm 5760 | điền 5761 | điều 5762 | điểm 5763 | điển 5764 | điểu 5765 | điệm 5766 | điện 5767 | điệp 5768 | điệu 5769 | đo 5770 | đoan 5771 | đom 5772 | đon 5773 | đong 5774 | đoài 5775 | đoàn 5776 | đoàng 5777 | đoành 5778 | đoái 5779 | đoán 5780 | đoạn 5781 | đoạt 5782 | đoản 5783 | đoảng 5784 | đu 5785 | đua 5786 | đui 5787 | đum 5788 | đun 5789 | đung 5790 | đuôi 5791 | đuểnh 5792 | đuốc 5793 | đuối 5794 | đuống 5795 | đuổi 5796 | đuỗn 5797 | đuột 5798 | đà 5799 | đài 5800 | đàm 5801 | đàn 5802 | đàng 5803 | đành 5804 | đào 5805 | đày 5806 | đá 5807 | đác 5808 | đái 5809 | đám 5810 | đán 5811 | đáng 5812 | đánh 5813 | đáo 5814 | đáp 5815 | đát 5816 | đáu 5817 | đáy 5818 | đâm 5819 | đâu 5820 | đây 5821 | đã 5822 | đãi 5823 | đãng 5824 | đè 5825 | đèn 5826 | đèo 5827 | đéc 5828 | đét 5829 | đê 5830 | đêm 5831 | đênh 5832 | đêu 5833 | đì 5834 | đìa 5835 | đình 5836 | đìu 5837 | đích 5838 | đính 5839 | đít 5840 | đò 5841 | đòi 5842 | đòn 5843 | đòng 5844 | đó 5845 | đóa 5846 | đói 5847 | đóm 5848 | đón 5849 | đóng 5850 | đót 5851 | đô 5852 | đôi 5853 | đôm 5854 | đôn 5855 | đông 5856 | đõ 5857 | đù 5858 | đùa 5859 | đùi 5860 | đùm 5861 | đùn 5862 | đùng 5863 | đú 5864 | đúa 5865 | đúc 5866 | đúm 5867 | đúng 5868 | đúp 5869 | đút 5870 | đăm 5871 | đăng 5872 | đĩ 5873 | đĩa 5874 | đĩnh 5875 | đũa 5876 | đũi 5877 | đũng 5878 | đơ 5879 | đơm 5880 | đơn 5881 | đưa 5882 | đưng 5883 | đương 5884 | đước 5885 | đười 5886 | đườn 5887 | đường 5888 | được 5889 | đượm 5890 | đạc 5891 | đạch 5892 | đại 5893 | đạm 5894 | đạn 5895 | đạo 5896 | đạp 5897 | đạt 5898 | đả 5899 | đảm 5900 | đản 5901 | đảng 5902 | đảnh 5903 | đảo 5904 | đấm 5905 | đấng 5906 | đất 5907 | đấu 5908 | đấy 5909 | đầm 5910 | đần 5911 | đầu 5912 | đầy 5913 | đẩu 5914 | đẩy 5915 | đẫm 5916 | đẫn 5917 | đẫy 5918 | đậm 5919 | đận 5920 | đập 5921 | đật 5922 | đậu 5923 | đậy 5924 | đắc 5925 | đắm 5926 | đắn 5927 | đắng 5928 | đắp 5929 | đắt 5930 | đằm 5931 | đằn 5932 | đằng 5933 | đẳng 5934 | đẵng 5935 | đặc 5936 | đặn 5937 | đặng 5938 | đặt 5939 | đẹn 5940 | đẹp 5941 | đẹt 5942 | đẻ 5943 | đẽ 5944 | đẽo 5945 | đế 5946 | đếch 5947 | đếm 5948 | đến 5949 | đề 5950 | đềm 5951 | đền 5952 | đều 5953 | để 5954 | đểnh 5955 | đểu 5956 | đễ 5957 | đệ 5958 | đệm 5959 | đỉa 5960 | đỉnh 5961 | địa 5962 | địch 5963 | định 5964 | địu 5965 | đọ 5966 | đọa 5967 | đọc 5968 | đọi 5969 | đọn 5970 | đọng 5971 | đọt 5972 | đỏ 5973 | đỏi 5974 | đỏm 5975 | đỏng 5976 | đố 5977 | đốc 5978 | đối 5979 | đốm 5980 | đốn 5981 | đống 5982 | đốp 5983 | đốt 5984 | đồ 5985 | đồi 5986 | đồm 5987 | đồn 5988 | đồng 5989 | đổ 5990 | đổi 5991 | đổng 5992 | đỗ 5993 | đỗi 5994 | độ 5995 | độc 5996 | đội 5997 | độn 5998 | động 5999 | độp 6000 | đột 6001 | đớ 6002 | đới 6003 | đớn 6004 | đớp 6005 | đớt 6006 | đờ 6007 | đời 6008 | đờm 6009 | đờn 6010 | đởm 6011 | đởn 6012 | đỡ 6013 | đợ 6014 | đợi 6015 | đợt 6016 | đục 6017 | đụn 6018 | đụng 6019 | đụp 6020 | đụt 6021 | đủ 6022 | đủi 6023 | đủng 6024 | đứ 6025 | đứa 6026 | đức 6027 | đứng 6028 | đứt 6029 | đừ 6030 | đừng 6031 | đực 6032 | đựng 6033 | ĩnh 6034 | ơ 6035 | ơi 6036 | ơn 6037 | ư 6038 | ưa 6039 | ưng 6040 | ưu 6041 | ươi 6042 | ươm 6043 | ươn 6044 | ương 6045 | ước 6046 | ướm 6047 | ướp 6048 | ướt 6049 | ườn 6050 | ưỡn 6051 | ạ 6052 | ạch 6053 | ạt 6054 | ả 6055 | ải 6056 | ảm 6057 | ảng 6058 | ảnh 6059 | ảo 6060 | ấm 6061 | ấn 6062 | ấp 6063 | ất 6064 | ấu 6065 | ấy 6066 | ầm 6067 | ầu 6068 | ẩm 6069 | ẩn 6070 | ẩu 6071 | ẩy 6072 | ậm 6073 | ập 6074 | ắc 6075 | ắng 6076 | ắp 6077 | ắt 6078 | ẳng 6079 | ẵm 6080 | ẹ 6081 | ẹc 6082 | ẹo 6083 | ẹp 6084 | ẹt 6085 | ẻn 6086 | ẻo 6087 | ế 6088 | ếch 6089 | ếm 6090 | ề 6091 | ềnh 6092 | ễnh 6093 | ệch 6094 | ỉ 6095 | ỉa 6096 | ỉm 6097 | ỉn 6098 | ỉu 6099 | ị 6100 | ịch 6101 | ịt 6102 | ọ 6103 | ọc 6104 | ọe 6105 | ọp 6106 | ỏi 6107 | ỏm 6108 | ỏn 6109 | ỏng 6110 | ố 6111 | ốc 6112 | ối 6113 | ốm 6114 | ống 6115 | ốp 6116 | ốt 6117 | ồ 6118 | ồm 6119 | ồn 6120 | ồng 6121 | ổ 6122 | ổi 6123 | ổn 6124 | ổng 6125 | ộc 6126 | ộp 6127 | ớ 6128 | ới 6129 | ớn 6130 | ớt 6131 | ờ 6132 | ở 6133 | ỡm 6134 | ợ 6135 | ợt 6136 | ụ 6137 | ục 6138 | ụp 6139 | ũ 6140 | ủ 6141 | ủa 6142 | ủi 6143 | ủn 6144 | ủng 6145 | ủy 6146 | ứ 6147 | ứa 6148 | ức 6149 | ứng 6150 | ừ 6151 | ừng 6152 | ử 6153 | ửng 6154 | ực 6155 | ỳ 6156 | ỷ 6157 | hừm 6158 | biêng 6159 | biêu 6160 | boóng 6161 | buộm 6162 | bướp 6163 | bạp 6164 | bạu 6165 | bảu 6166 | bấng 6167 | bằn 6168 | bặn 6169 | bặng 6170 | bặp 6171 | bủ 6172 | bứ 6173 | bựt 6174 | chiếp 6175 | choen 6176 | hoàng 6177 | choái 6178 | chuệch 6179 | chõm 6180 | chĩn 6181 | chũn 6182 | chưỡng 6183 | chạt 6184 | chẩu 6185 | chẫu 6186 | chẻng 6187 | chếm 6188 | chễnh 6189 | chịa 6190 | chỏn 6191 | chốp 6192 | chộ 6193 | chờm 6194 | chủn 6195 | cẫm 6196 | cẫn 6197 | cẳn 6198 | cặc 6199 | cọm 6200 | cỏm 6201 | cổi 6202 | cợm 6203 | cợp 6204 | cức 6205 | diếu 6206 | doành 6207 | doãi 6208 | duềnh 6209 | duốc 6210 | duộc 6211 | dàu 6212 | dím 6213 | dóa 6214 | dói 6215 | dóm 6216 | dùa 6217 | dùn 6218 | dĩn 6219 | dượi 6220 | dảnh 6221 | dảy 6222 | dắng 6223 | dẳn 6224 | dặng 6225 | dết 6226 | dệ 6227 | dệch 6228 | dịt 6229 | dổm 6230 | dụt 6231 | dức 6232 | ghính 6233 | ghểnh 6234 | ghệch 6235 | ghệt 6236 | ghịt 6237 | gie 6238 | gion 6239 | giâu 6240 | giéo 6241 | gióc 6242 | giô 6243 | giùi 6244 | giú 6245 | giướng 6246 | giại 6247 | giạng 6248 | giạp 6249 | giảnh 6250 | giảu 6251 | giấn 6252 | giằn 6253 | giẵm 6254 | giẹo 6255 | giọi 6256 | giỏn 6257 | giối 6258 | giốt 6259 | giồ 6260 | giồi 6261 | giỗi 6262 | giộp 6263 | giờn 6264 | giủi 6265 | guộn 6266 | guột 6267 | gáu 6268 | gíp 6269 | gùa 6270 | gùn 6271 | gùng 6272 | gưỡng 6273 | gượm 6274 | gại 6275 | gạnh 6276 | gạy 6277 | gẵng 6278 | gặn 6279 | gọ 6280 | gộ 6281 | hoăng 6282 | hoẳn 6283 | hoẻn 6284 | huếch 6285 | huốt 6286 | hánh 6287 | háp 6288 | hén 6289 | hĩm 6290 | hũm 6291 | hấm 6292 | hẩng 6293 | hẩy 6294 | hẳm 6295 | hặm 6296 | hềnh 6297 | hểnh 6298 | hệch 6299 | hịch 6300 | hỏ 6301 | hỏm 6302 | hộn 6303 | hờm 6304 | hởn 6305 | hụm 6306 | hủn 6307 | hứ 6308 | hự 6309 | khiệng 6310 | khoẻo 6311 | khuýp 6312 | kháp 6313 | khúng 6314 | khươi 6315 | khưởng 6316 | khượt 6317 | khảy 6318 | khắm 6319 | khắng 6320 | khằn 6321 | khặm 6322 | khẹc 6323 | khớ 6324 | khụng 6325 | khứng 6326 | kéc 6327 | kĩu 6328 | kều 6329 | kễnh 6330 | loen 6331 | loăn 6332 | loạc 6333 | luôm 6334 | luých 6335 | luỗng 6336 | lòn 6337 | lĩ 6338 | lươm 6339 | lướng 6340 | lạu 6341 | lảu 6342 | lẳm 6343 | lẹn 6344 | lểu 6345 | lịu 6346 | lỏa 6347 | lồn 6348 | lộm 6349 | lỡi 6350 | lủm 6351 | mám 6352 | míu 6353 | mòm 6354 | môm 6355 | múm 6356 | mưởi 6357 | mưỡu 6358 | mược 6359 | mậy 6360 | mế 6361 | mổng 6362 | mờm 6363 | mụi 6364 | mứu 6365 | mựa 6366 | nghiu 6367 | nghuếch 6368 | nghí 6369 | nghẻo 6370 | nghệu 6371 | nghỉnh 6372 | ngoao 6373 | ngoen 6374 | ngoáp 6375 | ngoẻn 6376 | nguỷu 6377 | ngáu 6378 | ngão 6379 | ngòng 6380 | ngóe 6381 | ngõa 6382 | ngõng 6383 | ngúc 6384 | ngơm 6385 | ngường 6386 | ngảnh 6387 | ngấc 6388 | ngậu 6389 | ngẳng 6390 | ngẵng 6391 | ngỏm 6392 | ngỏn 6393 | ngỏng 6394 | ngốt 6395 | ngớp 6396 | ngờm 6397 | ngủm 6398 | ngủng 6399 | ngứt 6400 | ngửng 6401 | nhoen 6402 | nhuôm 6403 | nhây 6404 | nhén 6405 | nhênh 6406 | nhía 6407 | nhính 6408 | nhôi 6409 | nhôn 6410 | nhúi 6411 | nhơi 6412 | nhơm 6413 | nhạng 6414 | nhạp 6415 | nhảo 6416 | nhần 6417 | nhặm 6418 | nhếu 6419 | nhểu 6420 | nhỉu 6421 | nhốc 6422 | nhội 6423 | nhớm 6424 | nhời 6425 | nhờm 6426 | nhởi 6427 | nhụng 6428 | nhủn 6429 | lý 6430 | niệt 6431 | nuốm 6432 | nuộc 6433 | nánh 6434 | náp 6435 | nênh 6436 | nính 6437 | níp 6438 | nò 6439 | nòm 6440 | nóp 6441 | nõ 6442 | nùn 6443 | nường 6444 | nẫy 6445 | nọn 6446 | nỏm 6447 | nổng 6448 | nỗng 6449 | nờm 6450 | nợp 6451 | nủa 6452 | oành 6453 | oạch 6454 | phiết 6455 | phiệu 6456 | phìa 6457 | phòi 6458 | phót 6459 | phôm 6460 | phĩnh 6461 | phắp 6462 | phếu 6463 | phề 6464 | phệnh 6465 | phớn 6466 | phựa 6467 | puốc 6468 | pụa 6469 | quàu 6470 | quày 6471 | quáo 6472 | qué 6473 | quén 6474 | quých 6475 | quăm 6476 | quạc 6477 | quạy 6478 | quải 6479 | quấc 6480 | quằm 6481 | quệch 6482 | quớ 6483 | riên 6484 | riễu 6485 | riệt 6486 | ruốt 6487 | rãy 6488 | rêm 6489 | rùn 6490 | rĩn 6491 | rạy 6492 | rảng 6493 | rảu 6494 | rấp 6495 | rẳn 6496 | rặc 6497 | rặm 6498 | rệch 6499 | rện 6500 | rỏm 6501 | rổn 6502 | rớp 6503 | rờm 6504 | rởn 6505 | rỡn 6506 | siếc 6507 | siểm 6508 | soải 6509 | soảng 6510 | sêu 6511 | sặm 6512 | sẹ 6513 | sều 6514 | sể 6515 | sờm 6516 | sựng 6517 | thuồn 6518 | thuỗn 6519 | tháu 6520 | thìu 6521 | thòa 6522 | thóm 6523 | thĩ 6524 | thưỡi 6525 | thưỡn 6526 | thẻo 6527 | thện 6528 | thồn 6529 | thỗn 6530 | thộc 6531 | thộp 6532 | toen 6533 | toèn 6534 | toạng 6535 | triềng 6536 | tríu 6537 | tròi 6538 | tróng 6539 | trô 6540 | trõm 6541 | trùy 6542 | trưỡng 6543 | trạt 6544 | trẩm 6545 | trẫm 6546 | trậm 6547 | trắt 6548 | trẽ 6549 | trếnh 6550 | trết 6551 | trếu 6552 | trịt 6553 | trổi 6554 | trộng 6555 | trớt 6556 | trụm 6557 | trửng 6558 | tuốn 6559 | téo 6560 | khát 6561 | tõe 6562 | tĩ 6563 | tĩn 6564 | tũm 6565 | tườu 6566 | tượt 6567 | tẳn 6568 | tặn 6569 | tẹp 6570 | tọng 6571 | tỏe 6572 | tợ 6573 | vên 6574 | vóng 6575 | vúc 6576 | vũm 6577 | vạp 6578 | vảnh 6579 | vậm 6580 | vẹc 6581 | vếu 6582 | vền 6583 | vịm 6584 | vỏng 6585 | vổ 6586 | vửng 6587 | xiểm 6588 | xoai 6589 | xoác 6590 | xoát 6591 | xoải 6592 | xoẳn 6593 | xuya 6594 | xuệch 6595 | xuổng 6596 | xàm 6597 | xàu 6598 | xáy 6599 | xêu 6600 | xùng 6601 | xăn 6602 | xũ 6603 | xơm 6604 | xơn 6605 | xải 6606 | xảu 6607 | xầu 6608 | xẩn 6609 | xắm 6610 | xẽo 6611 | xềm 6612 | xều 6613 | xể 6614 | xểnh 6615 | xệp 6616 | xỏa 6617 | xờm 6618 | xỡ 6619 | êu 6620 | ìn 6621 | òi 6622 | điu 6623 | đoác 6624 | đuềnh 6625 | đuồn 6626 | đách 6627 | đãy 6628 | đèm 6629 | đé 6630 | đém 6631 | đéo 6632 | đưỡn 6633 | đảy 6634 | nguyễn 6635 | đẵm 6636 | đẵn 6637 | đặm 6638 | đềnh 6639 | đệp 6640 | địt 6641 | đụ 6642 | đử 6643 | ẫm 6644 | ậu 6645 | ẽo 6646 | ỏe 6647 | ớm 6648 | ụt 6649 | ựa 6650 | khuỷnh 6651 | quýu 6652 | hị 6653 | uýnh 6654 | bau 6655 | biều 6656 | bui 6657 | bum 6658 | bun 6659 | bòi 6660 | bòm 6661 | bũm 6662 | bư 6663 | bưa 6664 | bướt 6665 | bường 6666 | bượt 6667 | bầng 6668 | bẳng 6669 | bếnh 6670 | bệp 6671 | bỉm 6672 | bọp 6673 | bỏn 6674 | bờn 6675 | bủm 6676 | cham 6677 | chem 6678 | chieng 6679 | chiệc 6680 | chom 6681 | choăn 6682 | choắc 6683 | chuy 6684 | chuân 6685 | chuôn 6686 | chuếch 6687 | chàu 6688 | chám 6689 | chéng 6690 | chìu 6691 | chô 6692 | chôi 6693 | chõi 6694 | chĩm 6695 | chĩu 6696 | chũ 6697 | chưn 6698 | chưởi 6699 | chảm 6700 | chảng 6701 | chảnh 6702 | chậy 6703 | chẳn 6704 | chẹp 6705 | chẻm 6706 | chẻn 6707 | chếp 6708 | chềm 6709 | chễ 6710 | chễm 6711 | chệp 6712 | chệt 6713 | chỉa 6714 | chịch 6715 | chổ 6716 | chổm 6717 | chộc 6718 | chợt 6719 | chụn 6720 | chủi 6721 | chứt 6722 | chử 6723 | cup 6724 | cuồi 6725 | cõ 6726 | cùa 6727 | cúa 6728 | cũm 6729 | cươi 6730 | cướng 6731 | cượng 6732 | cạt 6733 | cảy 6734 | cẩy 6735 | cẫu 6736 | cằng 6737 | cẵng 6738 | cửng 6739 | dem 6740 | diu 6741 | diêm 6742 | diếm 6743 | diến 6744 | diển 6745 | doan 6746 | duyến 6747 | duồn 6748 | duồng 6749 | dãng 6750 | dèm 6751 | dén 6752 | déo 6753 | dình 6754 | dích 6755 | dín 6756 | dít 6757 | dòn 6758 | dón 6759 | dót 6760 | dôn 6761 | dũ 6762 | dẩm 6763 | dắc 6764 | dẳm 6765 | dẵm 6766 | dẹm 6767 | dẽo 6768 | dến 6769 | dệu 6770 | dỉ 6771 | dịa 6772 | dịn 6773 | dọt 6774 | dốn 6775 | dống 6776 | dỗn 6777 | dộ 6778 | dộn 6779 | dởm 6780 | dụa 6781 | et 6782 | ghít 6783 | ghẹn 6784 | ghệ 6785 | ghị 6786 | giau 6787 | giay 6788 | gip 6789 | giu 6790 | giua 6791 | giào 6792 | giái 6793 | giáy 6794 | giên 6795 | giòng 6796 | gión 6797 | giôi 6798 | giơi 6799 | giư 6800 | giưa 6801 | giượng 6802 | giạc 6803 | giất 6804 | giẩy 6805 | giậc 6806 | giậy 6807 | giắc 6808 | giắm 6809 | giắn 6810 | giẳn 6811 | giẽ 6812 | giề 6813 | giọc 6814 | giốc 6815 | giộ 6816 | giởn 6817 | giợn 6818 | giừ 6819 | gong 6820 | gua 6821 | gun 6822 | gâm 6823 | gói 6824 | gôi 6825 | găn 6826 | gĩ 6827 | gơm 6828 | gơn 6829 | gường 6830 | gấn 6831 | gận 6832 | gị 6833 | gớ 6834 | gụt 6835 | gứng 6836 | hinh 6837 | hip 6838 | hiêu 6839 | hop 6840 | hot 6841 | hoái 6842 | hoát 6843 | hoăm 6844 | hoắng 6845 | hoằng 6846 | hoặn 6847 | hoẹt 6848 | huờ 6849 | huỡn 6850 | huỷnh 6851 | hím 6852 | hính 6853 | hóe 6854 | húm 6855 | hũng 6856 | hướm 6857 | hạy 6858 | hảm 6859 | hấng 6860 | hật 6861 | hẹm 6862 | hẹt 6863 | hỗm 6864 | hới 6865 | hụng 6866 | hủm 6867 | hừa 6868 | hửi 6869 | hựu 6870 | khia 6871 | khiểng 6872 | khon 6873 | khong 6874 | khoăm 6875 | khoắc 6876 | khoắm 6877 | khoẳng 6878 | khuảng 6879 | khuắng 6880 | khèo 6881 | khùa 6882 | khĩnh 6883 | khưu 6884 | khương 6885 | khạ 6886 | khầu 6887 | khẻo 6888 | khể 6889 | khổn 6890 | khỗi 6891 | khỗn 6892 | khở 6893 | khủa 6894 | khủy 6895 | khừa 6896 | kin 6897 | kiển 6898 | kíu 6899 | kĩnh 6900 | liếu 6901 | liềng 6902 | liểu 6903 | loai 6904 | loác 6905 | loán 6906 | loóng 6907 | luy 6908 | luyên 6909 | luổng 6910 | luợng 6911 | ly 6912 | lãy 6913 | lèng 6914 | lìn 6915 | lía 6916 | lón 6917 | lôn 6918 | lĩnh 6919 | lơng 6920 | lưn 6921 | lậm 6922 | lẳn 6923 | lếp 6924 | lễu 6925 | lện 6926 | lỉm 6927 | lọa 6928 | mem 6929 | mim 6930 | miêng 6931 | miển 6932 | miểng 6933 | miễng 6934 | mum 6935 | mán 6936 | mâng 6937 | mèng 6938 | mín 6939 | môt 6940 | mõi 6941 | mĩa 6942 | mơi 6943 | mơm 6944 | mươn 6945 | mấm 6946 | mầng 6947 | mẵm 6948 | mẻo 6949 | mịnh 6950 | mỏn 6951 | mớp 6952 | mụp 6953 | nau 6954 | net 6955 | ngam 6956 | nghìm 6957 | nghít 6958 | nghỉn 6959 | ngoam 6960 | ngoang 6961 | ngoeo 6962 | ngong 6963 | ngoàm 6964 | ngoạt 6965 | ngoảng 6966 | ngoắng 6967 | ngoẳn 6968 | ngoẽo 6969 | ngung 6970 | nguếch 6971 | nguồi 6972 | ngá 6973 | ngám 6974 | ngòn 6975 | ngõi 6976 | ngùm 6977 | ngùy 6978 | ngú 6979 | ngơn 6980 | ngươn 6981 | ngạ 6982 | ngạng 6983 | ngảng 6984 | ngảo 6985 | ngẩu 6986 | ngẫn 6987 | ngẫng 6988 | ngận 6989 | ngọa 6990 | ngồm 6991 | ngỗi 6992 | ngộp 6993 | nhiu 6994 | nhiểm 6995 | nhiện 6996 | nhiệp 6997 | nhoang 6998 | nhui 6999 | nhuế 7000 | nhuồn 7001 | nhày 7002 | nháng 7003 | nhê 7004 | nhìu 7005 | nhò 7006 | nhòn 7007 | nhóa 7008 | nhóe 7009 | nhõ 7010 | nhõn 7011 | nhù 7012 | nhùn 7013 | nhẫng 7014 | nhẳm 7015 | nhẻo 7016 | nhều 7017 | nhệu 7018 | nhỏn 7019 | nhừng 7020 | nhửng 7021 | nhữ 7022 | niếng 7023 | niền 7024 | nui 7025 | num 7026 | nuốc 7027 | nàm 7028 | nâm 7029 | nân 7030 | nãi 7031 | nình 7032 | ní 7033 | nú 7034 | núa 7035 | nưng 7036 | nược 7037 | nẩu 7038 | nẫm 7039 | nậng 7040 | nắt 7041 | nằn 7042 | nẳm 7043 | nẵng 7044 | nẽo 7045 | nọi 7046 | nỏi 7047 | nố 7048 | nốp 7049 | nồ 7050 | nồn 7051 | nờ 7052 | nứng 7053 | nừng 7054 | nử 7055 | on 7056 | oàm 7057 | oánh 7058 | oân 7059 | oăng 7060 | oẳn 7061 | phan 7062 | phia 7063 | phom 7064 | phuốc 7065 | phài 7066 | phìn 7067 | phưởng 7068 | phược 7069 | phạ 7070 | phạng 7071 | phạo 7072 | phạp 7073 | phầng 7074 | phẩn 7075 | phẩu 7076 | phắn 7077 | phặng 7078 | phẹc 7079 | phẹt 7080 | phềnh 7081 | phểu 7082 | phễn 7083 | phện 7084 | phệu 7085 | phọc 7086 | phọng 7087 | phốt 7088 | phồ 7089 | phồm 7090 | phời 7091 | phủng 7092 | phự 7093 | phựt 7094 | puộc 7095 | pà 7096 | pán 7097 | pã 7098 | pí 7099 | pơ 7100 | pạ 7101 | pả 7102 | pằn 7103 | pẻ 7104 | pờ 7105 | quao 7106 | quau 7107 | quyễn 7108 | quáu 7109 | quã 7110 | quẫng 7111 | quẳm 7112 | quẹn 7113 | quếu 7114 | quỷnh 7115 | rap 7116 | rem 7117 | reng 7118 | rieng 7119 | riềng 7120 | riểng 7121 | rom 7122 | ron 7123 | ruộc 7124 | ràu 7125 | rãn 7126 | rèo 7127 | rím 7128 | rín 7129 | ròm 7130 | róa 7131 | rôn 7132 | rúi 7133 | rĩnh 7134 | rư 7135 | rươm 7136 | rườn 7137 | rạu 7138 | rấn 7139 | rẩn 7140 | rẫn 7141 | rậu 7142 | rẳm 7143 | rẳng 7144 | rẵng 7145 | rẹo 7146 | rẹt 7147 | rếp 7148 | rểnh 7149 | rểu 7150 | rỉm 7151 | rỉn 7152 | rịnh 7153 | rọm 7154 | rọn 7155 | rỏng 7156 | rốp 7157 | rồm 7158 | rổi 7159 | rổng 7160 | rột 7161 | rợm 7162 | rợt 7163 | rứ 7164 | rừ 7165 | rửng 7166 | rựt 7167 | sec 7168 | sia 7169 | siem 7170 | siêm 7171 | siểng 7172 | som 7173 | sop 7174 | sua 7175 | suyến 7176 | suyền 7177 | sàu 7178 | sâng 7179 | sãn 7180 | sìn 7181 | sí 7182 | sín 7183 | sòa 7184 | sóm 7185 | sõm 7186 | sũ 7187 | sường 7188 | sưởng 7189 | sượi 7190 | sạc 7191 | sại 7192 | sảm 7193 | sật 7194 | sằn 7195 | sẵng 7196 | sẹm 7197 | sẻo 7198 | sế 7199 | sết 7200 | sềm 7201 | sễ 7202 | sệp 7203 | sỉnh 7204 | sỏng 7205 | sỗi 7206 | sộc 7207 | sớp 7208 | sủ 7209 | sừ 7210 | sừn 7211 | sựt 7212 | thiến 7213 | thiềm 7214 | thiệm 7215 | thoàn 7216 | thuy 7217 | thuông 7218 | thuấn 7219 | thuẩn 7220 | thuể 7221 | thuột 7222 | thàm 7223 | thàng 7224 | tháy 7225 | thướng 7226 | thấn 7227 | thẹp 7228 | thẻn 7229 | thếm 7230 | thịu 7231 | thỏn 7232 | thồi 7233 | thờm 7234 | thờn 7235 | thợt 7236 | thứa 7237 | top 7238 | tram 7239 | tran 7240 | triu 7241 | triêu 7242 | triến 7243 | triệng 7244 | troi 7245 | tron 7246 | trun 7247 | truật 7248 | truốt 7249 | truột 7250 | trài 7251 | trày 7252 | trãi 7253 | trãn 7254 | trè 7255 | trèn 7256 | trém 7257 | trìa 7258 | tría 7259 | tróm 7260 | trôm 7261 | trõn 7262 | trún 7263 | trư 7264 | trược 7265 | trạn 7266 | trạy 7267 | trẩn 7268 | trắn 7269 | trếch 7270 | trể 7271 | trịa 7272 | trỏi 7273 | trộc 7274 | trới 7275 | trờm 7276 | trờn 7277 | trụn 7278 | trủng 7279 | trừa 7280 | trử 7281 | trửu 7282 | trữu 7283 | trựa 7284 | trựng 7285 | tuệch 7286 | tuống 7287 | tèn 7288 | tén 7289 | téng 7290 | tìn 7291 | tơn 7292 | tướn 7293 | tườm 7294 | tượp 7295 | tẫn 7296 | tẻm 7297 | tềnh 7298 | tểu 7299 | tọ 7300 | tỏm 7301 | tộp 7302 | tớp 7303 | tớt 7304 | tởi 7305 | tủng 7306 | tứng 7307 | từa 7308 | tửa 7309 | uông 7310 | uốc 7311 | vam 7312 | viêng 7313 | vâu 7314 | vãn 7315 | vưng 7316 | vản 7317 | vẳn 7318 | vốp 7319 | vốt 7320 | vồi 7321 | xeng 7322 | xia 7323 | xiêng 7324 | xiển 7325 | xiệc 7326 | xoạng 7327 | xuy 7328 | xuyễn 7329 | xành 7330 | xín 7331 | xòm 7332 | xòng 7333 | xóp 7334 | xõm 7335 | xùa 7336 | xúa 7337 | xúp 7338 | xư 7339 | xười 7340 | xạp 7341 | xạu 7342 | xảnh 7343 | xẫm 7344 | xệu 7345 | xịch 7346 | xịn 7347 | xọe 7348 | xỏng 7349 | xốm 7350 | xớp 7351 | xởn 7352 | xợp 7353 | xợt 7354 | xụng 7355 | xụt 7356 | xủ 7357 | xủi 7358 | yêm 7359 | ành 7360 | ãnh 7361 | ính 7362 | ò 7363 | òm 7364 | điệt 7365 | đoa 7366 | đoi 7367 | đoãng 7368 | đuy 7369 | đuồi 7370 | đâng 7371 | đên 7372 | đìn 7373 | đía 7374 | đíp 7375 | đíu 7376 | đòm 7377 | đóc 7378 | đún 7379 | đũm 7380 | đư 7381 | đấp 7382 | đẳn 7383 | đẹ 7384 | đễnh 7385 | đị 7386 | đọp 7387 | đỗng 7388 | đợp 7389 | đừa 7390 | ầy 7391 | ặc 7392 | ặp 7393 | ếnh 7394 | ếp 7395 | ể 7396 | ễu 7397 | ệ 7398 | ện 7399 | ệnh 7400 | ệp 7401 | ịn 7402 | ọi 7403 | ọt 7404 | ỏ 7405 | ỏa 7406 | ồi 7407 | ộ 7408 | ộn 7409 | ời 7410 | ờn 7411 | ụa 7412 | kỳ 7413 | ĩ 7414 | ỹ 7415 | tỷ 7416 | lỵ 7417 | qui 7418 | -------------------------------------------------------------------------------- /init.sh: -------------------------------------------------------------------------------- 1 | #!bin/bash 2 | echo "Initial execution for project !!" 3 | -------------------------------------------------------------------------------- /lib/annotations.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beecost/data_engineering/84ea8e1c2e72f4efb753856aa0dd4234ae07da14/lib/annotations.jar -------------------------------------------------------------------------------- /lib/fastutil-6.4.3.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beecost/data_engineering/84ea8e1c2e72f4efb753856aa0dd4234ae07da14/lib/fastutil-6.4.3.jar -------------------------------------------------------------------------------- /lib/gson-2.2.4.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beecost/data_engineering/84ea8e1c2e72f4efb753856aa0dd4234ae07da14/lib/gson-2.2.4.jar -------------------------------------------------------------------------------- /lib/guava-14.0.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beecost/data_engineering/84ea8e1c2e72f4efb753856aa0dd4234ae07da14/lib/guava-14.0.1.jar -------------------------------------------------------------------------------- /lib/joda-time-1.6.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beecost/data_engineering/84ea8e1c2e72f4efb753856aa0dd4234ae07da14/lib/joda-time-1.6.jar -------------------------------------------------------------------------------- /lib/junit-4.8.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beecost/data_engineering/84ea8e1c2e72f4efb753856aa0dd4234ae07da14/lib/junit-4.8.2.jar -------------------------------------------------------------------------------- /lib/log4j-1.2.16.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beecost/data_engineering/84ea8e1c2e72f4efb753856aa0dd4234ae07da14/lib/log4j-1.2.16.jar -------------------------------------------------------------------------------- /lib/object-explorer.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beecost/data_engineering/84ea8e1c2e72f4efb753856aa0dd4234ae07da14/lib/object-explorer.jar -------------------------------------------------------------------------------- /lib/opencsv-3.5.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beecost/data_engineering/84ea8e1c2e72f4efb753856aa0dd4234ae07da14/lib/opencsv-3.5.jar -------------------------------------------------------------------------------- /lib/slf4j-api-1.6.4.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beecost/data_engineering/84ea8e1c2e72f4efb753856aa0dd4234ae07da14/lib/slf4j-api-1.6.4.jar -------------------------------------------------------------------------------- /lib/slf4j-log4j12-1.6.4.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beecost/data_engineering/84ea8e1c2e72f4efb753856aa0dd4234ae07da14/lib/slf4j-log4j12-1.6.4.jar -------------------------------------------------------------------------------- /lib/snappy-0.3.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beecost/data_engineering/84ea8e1c2e72f4efb753856aa0dd4234ae07da14/lib/snappy-0.3.jar -------------------------------------------------------------------------------- /lib/snappy-java-1.0.4.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beecost/data_engineering/84ea8e1c2e72f4efb753856aa0dd4234ae07da14/lib/snappy-java-1.0.4.1.jar -------------------------------------------------------------------------------- /libsrc/commons-io-2.4-sources.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beecost/data_engineering/84ea8e1c2e72f4efb753856aa0dd4234ae07da14/libsrc/commons-io-2.4-sources.jar -------------------------------------------------------------------------------- /libsrc/fastutil-6.4.3-sources.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beecost/data_engineering/84ea8e1c2e72f4efb753856aa0dd4234ae07da14/libsrc/fastutil-6.4.3-sources.jar -------------------------------------------------------------------------------- /libsrc/guava-12.0-sources.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beecost/data_engineering/84ea8e1c2e72f4efb753856aa0dd4234ae07da14/libsrc/guava-12.0-sources.jar -------------------------------------------------------------------------------- /libsrc/snappy-0.3-sources.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beecost/data_engineering/84ea8e1c2e72f4efb753856aa0dd4234ae07da14/libsrc/snappy-0.3-sources.jar -------------------------------------------------------------------------------- /libsrc/weka-3.8.0-src.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beecost/data_engineering/84ea8e1c2e72f4efb753856aa0dd4234ae07da14/libsrc/weka-3.8.0-src.jar -------------------------------------------------------------------------------- /src/hadoop_seqio.patch: -------------------------------------------------------------------------------- 1 | --- RawLocalFileSystem.java 2009-02-20 03:13:23.000000000 +0300 2 | +++ RawLocalFileSystem.java 2010-01-27 13:53:25.000000000 +0300 3 | @@ -66,12 +66,17 @@ public class RawLocalFileSystem extends 4 | } 5 | 6 | class TrackingFileInputStream extends FileInputStream { 7 | + private File f; 8 | + 9 | public TrackingFileInputStream(File f) throws IOException { 10 | super(f); 11 | + this.f = f; 12 | } 13 | 14 | public int read() throws IOException { 15 | + long ts = System.currentTimeMillis(); 16 | int result = super.read(); 17 | + System.out.println("IOSEQ readu bytes:1 millis:" + (System.currentTimeMillis()-ts) + " file:" + f); 18 | if (result != -1) { 19 | statistics.incrementBytesRead(1); 20 | } 21 | @@ -79,7 +84,9 @@ public class RawLocalFileSystem extends 22 | } 23 | 24 | public int read(byte[] data) throws IOException { 25 | + long ts = System.currentTimeMillis(); 26 | int result = super.read(data); 27 | + System.out.println("IOSEQ read bytes:" + data.length + " millis:" + (System.currentTimeMillis()-ts) + " file:" + f); 28 | if (result != -1) { 29 | statistics.incrementBytesRead(result); 30 | } 31 | @@ -87,7 +94,9 @@ public class RawLocalFileSystem extends 32 | } 33 | 34 | public int read(byte[] data, int offset, int length) throws IOException { 35 | + long ts = System.currentTimeMillis(); 36 | int result = super.read(data, offset, length); 37 | + System.out.println("IOSEQ read3 bytes:" + data.length + " millis:" + (System.currentTimeMillis()-ts) + " file:" + f); 38 | if (result != -1) { 39 | statistics.incrementBytesRead(result); 40 | } 41 | -------------------------------------------------------------------------------- /src/java/de/FastUtilExample.java: -------------------------------------------------------------------------------- 1 | package de; 2 | 3 | import it.unimi.dsi.fastutil.ints.IntArrayList; 4 | import it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap; 5 | import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; 6 | import objectexplorer.MemoryMeasurer; 7 | 8 | import java.util.*; 9 | 10 | public class FastUtilExample { 11 | 12 | private static final Random RAND = new Random(); 13 | 14 | // sinh ra số nguyên ngẫu nhiên 15 | private static int randomInt() { 16 | return RAND.nextInt(); 17 | } 18 | 19 | // tạo String ngẫu nhiên chứa kí tự từ 'a' - 'z' 20 | private static String randomString() { 21 | final int len = RAND.nextInt(100) + 1; 22 | final char[] value = new char[len]; 23 | for (int i=0; i < len; i++) { 24 | value[i] = (char)('a' + RAND.nextInt('z' - 'a')); 25 | } 26 | return new String(value); 27 | } 28 | 29 | public static void testList() { 30 | final int size = 1_000_000; 31 | System.out.println("\n- - - - - - - - "); 32 | System.out.println("Test memory java DEFAULT LIST and FAST LIST, test size = " + size); 33 | final List list = new ArrayList<>(size); 34 | final List fastList = new IntArrayList(size); 35 | for (int i=0; i T getUniqueAnnotation(Annotation[] annos, Class clazz) { 17 | for (Annotation anno : annos) { 18 | if (anno.annotationType() == clazz) { 19 | return (T) anno; 20 | } 21 | } 22 | return null; 23 | } 24 | 25 | public ArgInfo parseArgumentAnnotations(Class clazz, Annotation[] annos) throws ConfigurationException { 26 | Argument arg = getUniqueAnnotation(annos, Argument.class); 27 | if (arg == null) { 28 | throw new ConfigurationException("No annotation present: " + Argument.class); 29 | } 30 | DefaultValue defval = getUniqueAnnotation(annos, DefaultValue.class); 31 | 32 | ArgInfo info = new ArgInfo(); 33 | info.name = arg.name().toLowerCase(); 34 | info.noname = arg.noname(); 35 | info.description = arg.description(); 36 | if (clazz.isArray()) { 37 | info.clazz = clazz.getComponentType(); 38 | info.complex = true; 39 | } else { 40 | info.clazz = clazz; 41 | info.complex = false; 42 | } 43 | if (defval != null) { 44 | info.defaultable = true; 45 | info.defaultValue = DefaultValue.NULL.equals(defval.value()) ? null : defval.value(); 46 | } else { 47 | info.defaultable = false; 48 | info.defaultValue = null; 49 | } 50 | info.mapper = createMapper(arg.type()); 51 | return info; 52 | } 53 | 54 | public void parseArgumentListAnnotations(Method method, ToolInfo toolinfo) throws ConfigurationException { 55 | toolinfo.args = new HashMap(); 56 | toolinfo.nargs = new ArrayList(); 57 | int cnt = method.getParameterTypes().length; 58 | for (int i = 0; i < cnt; i++) { 59 | ArgInfo info = parseArgumentAnnotations(method.getParameterTypes()[i], method.getParameterAnnotations()[i]); 60 | info.pos = i; 61 | if (info.noname) { 62 | toolinfo.nargs.add(info); 63 | } else { 64 | if (toolinfo.args.containsKey(info.name)) { 65 | throw new ConfigurationException("Duplicate argument name " + info.name); 66 | } 67 | toolinfo.args.put(info.name, info); 68 | } 69 | } 70 | checkNamedArguments(toolinfo.args.values()); 71 | checkNonameArguments(toolinfo.nargs); 72 | } 73 | 74 | private static void checkNonameArguments(Collection arglist) throws ConfigurationException { 75 | for (ArgInfo arg : arglist) { 76 | if (arg.isComplex()) { 77 | throw new ConfigurationException("Noname arguments can't be complex: " + arg.name); 78 | } 79 | if (arg.defaultable) { 80 | throw new ConfigurationException("Noname arguments can't have default value: " + arg.name); 81 | } 82 | } 83 | } 84 | 85 | private static void checkNamedArguments(Collection arglist) throws ConfigurationException { 86 | for (ArgInfo arg : arglist) { 87 | if (arg.defaultable && arg.defaultValue == null && arg.clazz.isPrimitive()) { 88 | throw new ConfigurationException("Primitive-typed classes can't have null as default value: " + arg.name); 89 | } 90 | } 91 | } 92 | 93 | 94 | private TypeMapper createMapper(Class clazz) throws ConfigurationException { 95 | try { 96 | return (TypeMapper) clazz.newInstance(); 97 | } catch (IllegalAccessException exc) { 98 | throw new ConfigurationException(exc.getClass().getCanonicalName() + ": " + clazz); 99 | } catch (InstantiationException exc) { 100 | throw new ConfigurationException(exc.getClass().getCanonicalName() + ": " + clazz); 101 | } catch (ClassCastException exc) { 102 | throw new ConfigurationException("Not a mapper: " + clazz); 103 | } 104 | } 105 | 106 | public Map parseClassAnnotations(Class clazz) throws ConfigurationException { 107 | Map tools = new TreeMap(); 108 | for (Method method : clazz.getMethods()) { 109 | Tool tool = getUniqueAnnotation(method.getAnnotations(), Tool.class); 110 | if (tool == null) { 111 | continue; 112 | } 113 | 114 | ToolInfo info = new ToolInfo(); 115 | info.name = tool.name().toLowerCase(); 116 | info.title = tool.title(); 117 | info.description = tool.description(); 118 | parseArgumentListAnnotations(method, info); 119 | info.method = method; 120 | 121 | if (tools.containsKey(info.name)) { 122 | throw new ConfigurationException("Duplicate tool name: " + info.name); 123 | } 124 | tools.put(info.name, info); 125 | } 126 | return tools; 127 | } 128 | } 129 | -------------------------------------------------------------------------------- /src/java/tool/tooling/Arg.java: -------------------------------------------------------------------------------- 1 | package tool.tooling; 2 | 3 | public class Arg { 4 | private String name; 5 | private String value; 6 | 7 | public Arg(String name, String value) { 8 | this.name = name; 9 | this.value = value; 10 | } 11 | 12 | public String getName() { 13 | return name; 14 | } 15 | 16 | public String getValue() { 17 | return value; 18 | } 19 | } -------------------------------------------------------------------------------- /src/java/tool/tooling/ArgInfo.java: -------------------------------------------------------------------------------- 1 | package tool.tooling; 2 | 3 | 4 | class ArgInfo { 5 | String name; 6 | String description; 7 | Class clazz; 8 | TypeMapper mapper; 9 | boolean complex; 10 | String defaultValue; 11 | boolean defaultable; 12 | boolean noname; 13 | int pos; 14 | 15 | public Object map(String str) throws TypeMappingException { 16 | return mapper.map(str, clazz); 17 | } 18 | 19 | public boolean isMandatory() { 20 | return !defaultable; 21 | } 22 | 23 | public boolean isOptional() { 24 | return defaultable; 25 | } 26 | 27 | public boolean isComplex() { 28 | return complex; 29 | } 30 | 31 | public String defaultValue() { 32 | return defaultValue; 33 | } 34 | 35 | public boolean isCustomMapper() { 36 | return !DefaultTypeMapper.class.equals(mapper.getClass()); 37 | } 38 | } -------------------------------------------------------------------------------- /src/java/tool/tooling/Argument.java: -------------------------------------------------------------------------------- 1 | package tool.tooling; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | 9 | @Target(ElementType.PARAMETER) 10 | @Retention(RetentionPolicy.RUNTIME) 11 | public @interface Argument { 12 | String name(); 13 | String description() default ""; 14 | Class type() default DefaultTypeMapper.class; 15 | boolean noname() default false; 16 | } 17 | -------------------------------------------------------------------------------- /src/java/tool/tooling/CommandLineParser.java: -------------------------------------------------------------------------------- 1 | package tool.tooling; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class CommandLineParser { 7 | 8 | private Arg parseArgument(String str) throws CommandLineParsingException { 9 | if (str.startsWith("-")) { 10 | Arg arg = null; 11 | str = str.replaceFirst("^-+", ""); 12 | if (str.contains("=")) { 13 | int epos = str.indexOf('='); 14 | arg = new Arg(str.substring(0, epos).toLowerCase(), str.substring(epos+1)); 15 | } else { 16 | arg = new Arg(str.toLowerCase(), Boolean.TRUE.toString()); 17 | } 18 | return arg; 19 | } else { 20 | return new Arg(null, str); 21 | } 22 | } 23 | 24 | public List parseArguments(String[] argv) throws CommandLineParsingException { 25 | List arguments = new ArrayList(); 26 | for (String arg : argv) { 27 | arguments.add(parseArgument(arg)); 28 | } 29 | return arguments; 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/java/tool/tooling/CommandLineParsingException.java: -------------------------------------------------------------------------------- 1 | package tool.tooling; 2 | 3 | class CommandLineParsingException extends ToolingException { 4 | private static final long serialVersionUID = 1L; 5 | 6 | public CommandLineParsingException(String msg) { 7 | super(msg); 8 | } 9 | } -------------------------------------------------------------------------------- /src/java/tool/tooling/ConfigurationException.java: -------------------------------------------------------------------------------- 1 | package tool.tooling; 2 | 3 | public class ConfigurationException extends ToolingException { 4 | private static final long serialVersionUID = 1L; 5 | 6 | public ConfigurationException(String msg) { 7 | super(msg); 8 | } 9 | 10 | public ConfigurationException(String msg, Throwable t) { 11 | super(msg, t); 12 | } 13 | } -------------------------------------------------------------------------------- /src/java/tool/tooling/DateMapper.java: -------------------------------------------------------------------------------- 1 | package tool.tooling; 2 | 3 | import java.text.ParseException; 4 | import java.text.SimpleDateFormat; 5 | 6 | 7 | public class DateMapper implements TypeMapper { 8 | private static final String FMT = "dd.MM.yyyy"; 9 | 10 | @Override 11 | public Object map(String str, Class clazz) throws TypeMappingException { 12 | if ( str == null ) 13 | return null; 14 | try { 15 | return new SimpleDateFormat(FMT).parseObject(str); 16 | } catch (ParseException exc) { 17 | throw new TypeMappingException(exc); 18 | } 19 | } 20 | 21 | @Override 22 | public String supportedValues(Class clazz) { 23 | return FMT; 24 | } 25 | } -------------------------------------------------------------------------------- /src/java/tool/tooling/DefaultTypeMapper.java: -------------------------------------------------------------------------------- 1 | package tool.tooling; 2 | 3 | import java.io.File; 4 | import java.net.MalformedURLException; 5 | import java.net.URI; 6 | import java.net.URISyntaxException; 7 | import java.net.URL; 8 | import java.util.ArrayList; 9 | import java.util.Arrays; 10 | import java.util.List; 11 | 12 | @SuppressWarnings("unchecked") 13 | public class DefaultTypeMapper implements TypeMapper { 14 | 15 | public static String implode(String delim, List elements) { 16 | return implode(delim, elements.toArray(new String[]{})); 17 | } 18 | 19 | public static String implode(String delim, String... elements) { 20 | StringBuilder str = new StringBuilder(); 21 | boolean first = true; 22 | for (String el : elements) { 23 | if (!first) { 24 | str.append(delim); 25 | } 26 | str.append(el); 27 | first = false; 28 | } 29 | 30 | return str.toString(); 31 | } 32 | 33 | public DefaultTypeMapper() { 34 | } 35 | 36 | public Object map(String str, Class clazz) throws TypeMappingException { 37 | if (str == null) { 38 | return null; 39 | } else if (clazz == String.class) { 40 | return str; 41 | } else if (clazz == Boolean.class || clazz == Boolean.TYPE) { 42 | return new Boolean(Boolean.parseBoolean(str)); 43 | } else if (clazz == Byte.class || clazz == Byte.TYPE) { 44 | return new Byte(Byte.parseByte(str)); 45 | } else if (clazz == Short.class || clazz == Short.TYPE) { 46 | return new Short(Short.parseShort(str)); 47 | } else if (clazz == Integer.class || clazz == Integer.TYPE) { 48 | return new Integer(Integer.parseInt(str)); 49 | } else if (clazz == Long.class || clazz == Long.TYPE) { 50 | return new Long(Long.parseLong(str)); 51 | } else if (clazz == Float.class || clazz == Float.TYPE) { 52 | return new Float(Float.parseFloat(str)); 53 | } else if (clazz == Double.class || clazz == Double.TYPE) { 54 | return new Double(Double.parseDouble(str)); 55 | } else if (clazz == Character.class || clazz == Character.TYPE) { 56 | if (str.length() != 1) { 57 | throw new TypeMappingException(clazz, str); 58 | } 59 | return new Character((char)str.indexOf(0)); 60 | } else if (clazz == File.class) { 61 | return new File(str); 62 | } else if (clazz == URL.class) { 63 | try { 64 | return new URL(str); 65 | } catch (MalformedURLException exc) { 66 | throw new TypeMappingException(clazz, str); 67 | } 68 | } else if (clazz == URI.class) { 69 | try { 70 | return new URI(str); 71 | } catch (URISyntaxException exc) { 72 | throw new TypeMappingException(clazz, str); 73 | } 74 | } else if (clazz.isEnum()) { 75 | try { 76 | return Enum.valueOf(clazz, str); 77 | } catch (IllegalArgumentException exc) { 78 | throw new TypeMappingException(clazz, str); 79 | } 80 | } else { 81 | throw new TypeMappingException(clazz, str); 82 | } 83 | } 84 | 85 | @Override 86 | public String supportedValues(Class clazz) { 87 | if (clazz.isEnum()) { 88 | List constants = Arrays.asList(clazz.getEnumConstants()); 89 | List values = new ArrayList(constants.size()); 90 | for (Object constant : constants) { 91 | values.add(constant.toString()); 92 | } 93 | return String.format(implode(", ", values)); 94 | } else if (clazz == Boolean.class || clazz == Boolean.TYPE) { 95 | return "true|false"; 96 | } else { 97 | return clazz.getSimpleName(); 98 | } 99 | } 100 | } -------------------------------------------------------------------------------- /src/java/tool/tooling/DefaultValue.java: -------------------------------------------------------------------------------- 1 | package tool.tooling; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Target(ElementType.PARAMETER) 9 | @Retention(RetentionPolicy.RUNTIME) 10 | public @interface DefaultValue { 11 | String value() default NULL; 12 | static final String NULL = "Ganjoowm4EbwybCiv6Lewyidrayd4"; 13 | } 14 | -------------------------------------------------------------------------------- /src/java/tool/tooling/PortNumberMapper.java: -------------------------------------------------------------------------------- 1 | package tool.tooling; 2 | 3 | import java.io.IOException; 4 | import java.net.ServerSocket; 5 | 6 | 7 | public class PortNumberMapper implements TypeMapper { 8 | public static final String AUTO = "auto"; 9 | public static final String NONE = "none"; 10 | 11 | private static int findFreePort() throws IOException { 12 | // http://chaoticjava.com/posts/retrieving-a-free-port-for-socket-binding/ 13 | ServerSocket server = new ServerSocket(0); 14 | int port = server.getLocalPort(); 15 | server.close(); 16 | return port; 17 | } 18 | 19 | 20 | @Override 21 | public Object map(String str, Class clazz) throws TypeMappingException { 22 | if (NONE.equals(str)) { 23 | return null; 24 | } else if (AUTO.equals(str)) { 25 | try { 26 | return findFreePort(); 27 | } catch (IOException exc) { 28 | throw new TypeMappingException(exc); 29 | } 30 | } else { 31 | try { 32 | return Integer.parseInt(str); 33 | } catch (NumberFormatException exc) { 34 | throw new TypeMappingException(clazz, str); 35 | } 36 | } 37 | } 38 | 39 | 40 | @Override 41 | public String supportedValues(Class clazz) { 42 | return String.format("Число, либо '%s', либо '%s'", AUTO, NONE); 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /src/java/tool/tooling/Runner.java: -------------------------------------------------------------------------------- 1 | package tool.tooling; 2 | 3 | import java.io.PrintStream; 4 | import java.lang.reflect.Array; 5 | import java.lang.reflect.InvocationTargetException; 6 | import java.util.ArrayList; 7 | import java.util.Iterator; 8 | import java.util.List; 9 | import java.util.Map; 10 | 11 | public class Runner { 12 | private CommandLineParser cmdParser = new CommandLineParser(); 13 | private AnnotationParser annoParser = new AnnotationParser(); 14 | 15 | private String general(Object obj) { 16 | return String.format("Usage: %s [arguments]\n" + 17 | " %s help \n", obj.getClass().getName(), obj.getClass().getName()); 18 | } 19 | 20 | public static String[] shift(String[] arr, int cnt) { 21 | int len = arr.length - cnt; 22 | String[] arrnew = new String[len]; 23 | System.arraycopy(arr, cnt, arrnew, 0, len); 24 | return arrnew; 25 | } 26 | 27 | public void run(Object obj, String[] args, PrintStream ps) throws ToolingException { 28 | Map toolInfoes = annoParser.parseClassAnnotations(obj.getClass()); 29 | 30 | if (args.length == 0) { 31 | ps.println(); 32 | ps.print(general(obj)); 33 | ps.println(); 34 | printTools(toolInfoes, ps); 35 | ps.println(); 36 | System.exit(-1); 37 | } 38 | String toolname = args[0].toLowerCase(); 39 | args = shift(args, 1); 40 | if ("help".equals(toolname)) { 41 | if (args.length != 1) { 42 | ps.println(); 43 | ps.print(general(obj)); 44 | ps.println(); 45 | printTools(toolInfoes, ps); 46 | ps.println(); 47 | System.exit(-1); 48 | } 49 | toolname = args[0]; 50 | if (!toolInfoes.containsKey(toolname)) { 51 | ps.println(); 52 | ps.println("Unknown tool: " + toolname + "\n\n"); 53 | ps.print(general(obj)); 54 | ps.println(); 55 | printTools(toolInfoes, ps); 56 | ps.println(); 57 | System.exit(-1); 58 | } 59 | ps.println(); 60 | printToolHelp(toolInfoes.get(toolname), ps); 61 | ps.println(); 62 | System.exit(0); 63 | } 64 | if (!toolInfoes.containsKey(toolname)) { 65 | ps.println(); 66 | ps.println("Unknown tool: " + toolname + "\n\n"); 67 | ps.println(); 68 | ps.print(general(obj)); 69 | ps.println(); 70 | printTools(toolInfoes, ps); 71 | ps.println(); 72 | System.exit(-1); 73 | } 74 | 75 | List arglist = cmdParser.parseArguments(args); 76 | runTool(obj, toolInfoes.get(toolname), arglist); 77 | } 78 | 79 | private static final int COLS = 100; 80 | 81 | private void printToolHelp(ToolInfo info, PrintStream ps) { 82 | ps.println("NAME"); 83 | { 84 | String prefix = " " + info.name + " — "; 85 | List lines = fit(info.title, COLS-prefix.length()); 86 | for (int i = 0; i < lines.size(); i++) { 87 | if (i == 0) { 88 | ps.print(prefix); 89 | } else { 90 | ps.print(spaces(prefix.length())); 91 | } 92 | ps.println(lines.get(i)); 93 | } 94 | } 95 | ps.println(); 96 | ps.println("USAGE"); 97 | ps.println(" " + usage(info)); 98 | ps.println(); 99 | ps.println("DESCRIPTION"); 100 | { 101 | List lines = fit(info.description, COLS-7); 102 | for (String line : lines) { 103 | ps.println(" " + line); 104 | } 105 | } 106 | ps.println(); 107 | ps.println("ARGUMENTS"); 108 | int maxname = 0; 109 | for (ArgInfo arg : info.args.values()) { 110 | maxname = Math.max(arg.name.length(), maxname); 111 | } 112 | 113 | List args = new ArrayList(); 114 | args.addAll(info.args.values()); 115 | args.addAll(info.nargs); 116 | 117 | for (ArgInfo arg : args) { 118 | String out = String.format(" %s ", pad("--" + arg.name, maxname+2)); 119 | int rwidth = out.length(); 120 | int dwidth = Math.max(COLS-rwidth, 20); 121 | List lines = fit(argdesc(arg), dwidth); 122 | for (int i = 0; i < lines.size(); i++) { 123 | if (i != 0) { 124 | out += "\n"; 125 | out += spaces(rwidth); 126 | } 127 | out += lines.get(i); 128 | } 129 | ps.println(out); 130 | ps.println(); 131 | } 132 | } 133 | 134 | private String argdesc(ArgInfo ai) { 135 | String desc = ai.description.trim(); 136 | if (ai.defaultable && ai.defaultValue != null) { 137 | if (desc.charAt(desc.length()-1) != '.') { 138 | desc += '.'; 139 | } 140 | desc += " По умолчанию " + ai.defaultValue + "."; 141 | } 142 | if (desc.charAt(desc.length()-1) != '.') { 143 | desc += '.'; 144 | } 145 | desc += String.format(" (%s)", ai.mapper.supportedValues(ai.clazz)); 146 | return desc; 147 | } 148 | 149 | private static List removeArgs(List arglist, String name) { 150 | List args = new ArrayList(); 151 | Iterator it = arglist.iterator(); 152 | while (it.hasNext()) { 153 | Arg arg = it.next(); 154 | if (arg.getName().equals(name)) { 155 | it.remove(); 156 | args.add(arg); 157 | } 158 | } 159 | return args; 160 | } 161 | 162 | private void runTool(Object obj, ToolInfo toolinfo, List arglist) throws ToolingException { 163 | Object[] objs = mapArguments(toolinfo, arglist); 164 | 165 | try { 166 | toolinfo.method.invoke(obj, objs); 167 | } catch (InvocationTargetException exc) { 168 | throw new ToolingException(exc); 169 | } catch (IllegalAccessException exc) { 170 | throw new ToolingException(exc); 171 | } 172 | } 173 | 174 | private Object[] mapArguments(ToolInfo toolinfo, List arglist) throws ToolingException { 175 | Object[] objs = new Object[toolinfo.args.size() + toolinfo.nargs.size()]; 176 | 177 | for (String name : toolinfo.args.keySet()) { 178 | ArgInfo info = toolinfo.args.get(name); 179 | List args = removeArgs(arglist, name); 180 | 181 | if (args.isEmpty()) { 182 | if (info.isMandatory() && !info.isComplex()) { 183 | throw new ToolingException("Argument not specified: " + name); 184 | } else { 185 | Object obj = info.map(info.defaultValue); 186 | if (info.isComplex()) { 187 | Object list = Array.newInstance(info.clazz, 1); 188 | Array.set(list, 0, obj); 189 | objs[info.pos] = list; 190 | } else { 191 | objs[info.pos] = obj; 192 | } 193 | } 194 | } else { 195 | if (args.size() > 1 && !info.isComplex()) { 196 | throw new ToolingException("Duplicate argument: " + name); 197 | } 198 | if (info.isComplex()) { 199 | Object list = Array.newInstance(info.clazz, args.size()); 200 | for (int i = 0; i < args.size(); i++) { 201 | Array.set(list, i, info.map(args.get(i).getValue())); 202 | } 203 | objs[info.pos] = list; 204 | 205 | } else { 206 | objs[info.pos] = info.map(args.get(0).getValue()); 207 | } 208 | } 209 | } 210 | 211 | for (Arg arg : arglist) { 212 | if (arg.getName() != null) { 213 | throw new ToolingException("Unknown argument: " + arg.getName()); 214 | } 215 | } 216 | 217 | for (ArgInfo info : toolinfo.nargs) { 218 | if (arglist.isEmpty()) { 219 | throw new ToolingException("Argument not specified: " + info.name); 220 | } 221 | if (info.isComplex()) { 222 | Object arr = Array.newInstance(info.clazz, arglist.size()); 223 | for (int i = 0; i < arglist.size(); i++) { 224 | Array.set(arr, i, info.map(arglist.get(i).getValue())); 225 | } 226 | arglist.clear(); 227 | objs[info.pos] = arr; 228 | } else { 229 | objs[info.pos] = info.map(arglist.remove(0).getValue()); 230 | } 231 | } 232 | 233 | return objs; 234 | } 235 | 236 | private String usage(ToolInfo tinfo) { 237 | boolean hasOptions = false; 238 | for (ArgInfo info : tinfo.args.values()) { 239 | if (info.defaultable) { 240 | hasOptions = true; 241 | } 242 | } 243 | 244 | StringBuilder str = new StringBuilder(); 245 | 246 | str.append(tinfo.name); 247 | 248 | if (hasOptions) { 249 | str.append(" [options]"); 250 | } 251 | 252 | for (ArgInfo info : tinfo.args.values()) { 253 | if (info.defaultable) { 254 | continue; 255 | } 256 | 257 | String s = "--" + info.name + "="; 258 | 259 | if (info.isOptional()) { 260 | s = "[" + s + "]"; 261 | } 262 | if (info.complex) { 263 | if (info.isOptional()) { 264 | s = "(" + s + ")*"; 265 | } else { 266 | s = "(" + s + ")+"; 267 | } 268 | } 269 | 270 | str.append(' ').append(s); 271 | } 272 | 273 | for (ArgInfo info : tinfo.nargs) { 274 | str.append(" <" + info.name + ">"); 275 | } 276 | 277 | return str.toString(); 278 | } 279 | 280 | private static void printTools(Map infoes, PrintStream ps) { 281 | ps.println("Available tools:"); 282 | int twidth = 0; 283 | for (ToolInfo info : infoes.values()) { 284 | twidth = Math.max(twidth, info.name.length()); 285 | } 286 | for (ToolInfo info : infoes.values()) { 287 | String out = String.format(" %s ", pad(info.name, twidth)); 288 | int rwidth = out.length(); 289 | int dwidth = Math.max(100-rwidth, 20); 290 | List lines = fit(info.title, dwidth); 291 | for (int i = 0; i < lines.size(); i++) { 292 | if (i != 0) { 293 | out += "\n"; 294 | out += spaces(rwidth); 295 | } 296 | out += lines.get(i); 297 | } 298 | ps.println(out); 299 | } 300 | } 301 | 302 | private static String spaces(int count) { 303 | String out = ""; 304 | for (int j = 0; j < count; j++) { 305 | out += " "; 306 | } 307 | return out; 308 | } 309 | 310 | private static String pad(String str, int width) { 311 | while (str.length() < width) { 312 | str += ' '; 313 | } 314 | return str; 315 | } 316 | 317 | private static List fit(String str, int width) { 318 | List lines = new ArrayList(); 319 | while (!str.isEmpty()) { 320 | int len = optimizeCutPoint(str, Math.min(width, str.length())); 321 | lines.add(str.substring(0, len)); 322 | str = str.substring(len); 323 | } 324 | return lines; 325 | } 326 | 327 | static int optimizeCutPoint(String str, int target) { 328 | String tmp = ""; 329 | boolean alpha = false; 330 | List parts = new ArrayList(); 331 | for (int i = 0; i < str.length(); i++) { 332 | char c = str.charAt(i); 333 | boolean alphaNew = Character.isLetterOrDigit(c); 334 | if (!alpha && alphaNew && !tmp.isEmpty()) { 335 | parts.add(tmp); 336 | tmp = ""; 337 | } 338 | alpha = alphaNew; 339 | tmp += c; 340 | } 341 | if (!tmp.isEmpty()) { 342 | parts.add(tmp); 343 | } 344 | 345 | String result = ""; 346 | while (!parts.isEmpty() && (result.length() + parts.get(0).length() <= target)) { 347 | result += parts.remove(0); 348 | } 349 | 350 | if (result.isEmpty()) { 351 | return target; 352 | } else { 353 | return result.length(); 354 | } 355 | } 356 | 357 | } 358 | -------------------------------------------------------------------------------- /src/java/tool/tooling/Tool.java: -------------------------------------------------------------------------------- 1 | package tool.tooling; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Target(ElementType.METHOD) 9 | @Retention(RetentionPolicy.RUNTIME) 10 | public @interface Tool { 11 | String name(); 12 | String title() default ""; 13 | String description() default ""; 14 | } 15 | -------------------------------------------------------------------------------- /src/java/tool/tooling/ToolInfo.java: -------------------------------------------------------------------------------- 1 | package tool.tooling; 2 | 3 | import java.lang.reflect.Method; 4 | import java.util.List; 5 | import java.util.Map; 6 | 7 | 8 | class ToolInfo { 9 | String name; 10 | String title; 11 | String description; 12 | Method method; 13 | Map args; 14 | List nargs; 15 | } -------------------------------------------------------------------------------- /src/java/tool/tooling/ToolingException.java: -------------------------------------------------------------------------------- 1 | package tool.tooling; 2 | 3 | public class ToolingException extends Exception { 4 | private static final long serialVersionUID = 1L; 5 | 6 | public ToolingException() { 7 | super(); 8 | } 9 | 10 | public ToolingException(String message, Throwable cause) { 11 | super(message, cause); 12 | } 13 | 14 | public ToolingException(String message) { 15 | super(message); 16 | } 17 | 18 | public ToolingException(Throwable cause) { 19 | super(cause); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/java/tool/tooling/TypeMapper.java: -------------------------------------------------------------------------------- 1 | package tool.tooling; 2 | 3 | public interface TypeMapper { 4 | public Object map(String str, Class clazz) throws TypeMappingException; 5 | public String supportedValues(Class clazz); 6 | } -------------------------------------------------------------------------------- /src/java/tool/tooling/TypeMappingException.java: -------------------------------------------------------------------------------- 1 | package tool.tooling; 2 | 3 | public class TypeMappingException extends ToolingException { 4 | private static final long serialVersionUID = 1L; 5 | 6 | public TypeMappingException(Class clazz, String value) { 7 | super(String.format("Don't now how to map %s to %s", value, clazz)); 8 | } 9 | 10 | public TypeMappingException(Throwable t) { 11 | super("Couldn't map", t); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/java/utils/DateTimeUtils.java: -------------------------------------------------------------------------------- 1 | package utils; 2 | 3 | import org.joda.time.format.DateTimeFormat; 4 | import org.joda.time.format.DateTimeFormatter; 5 | 6 | import java.util.Calendar; 7 | 8 | public class DateTimeUtils { 9 | 10 | public static DateTimeFormatter BIRTHDAY_VN_FORMAT = getDateTimeFormatter("dd/MM/yyyy"); 11 | public static DateTimeFormatter BIRTHDAY_EN_FORMAT = getDateTimeFormatter("MM/dd/yyyy"); 12 | public static final Calendar CALENDAR = Calendar.getInstance(); 13 | public static DateTimeFormatter getDateTimeFormatter(String pattern) { 14 | return DateTimeFormat.forPattern(pattern); 15 | } 16 | 17 | public static final int currentYear() { 18 | return CALENDAR.get(Calendar.YEAR); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/java/utils/FileUtils.java: -------------------------------------------------------------------------------- 1 | package utils; 2 | 3 | import com.google.common.hash.HashCode; 4 | import com.google.common.hash.Hashing; 5 | import it.unimi.dsi.fastutil.objects.ObjectArrayList; 6 | import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; 7 | import org.iq80.snappy.SnappyInputStream; 8 | import org.iq80.snappy.SnappyOutputStream; 9 | import org.jetbrains.annotations.NotNull; 10 | import org.jetbrains.annotations.Nullable; 11 | 12 | import java.io.*; 13 | import java.nio.charset.Charset; 14 | import java.nio.charset.StandardCharsets; 15 | import java.nio.file.*; 16 | import java.nio.file.attribute.BasicFileAttributes; 17 | import java.nio.file.attribute.PosixFilePermission; 18 | import java.util.*; 19 | import java.util.zip.*; 20 | 21 | public final class FileUtils { 22 | 23 | private static final org.slf4j.Logger LOG = org.slf4j.LoggerFactory.getLogger(FileUtils.class); 24 | 25 | /** 26 | * After a successful call, a directory with the given pathname will exist. 27 | * Uses {@link File#mkdir()} to create the directory, if it doesn't exist 28 | * yet. 29 | */ 30 | public static void mkdir(@NotNull File file) throws IOException { 31 | if (file.exists()) { 32 | if (!file.isDirectory()) { 33 | throw new IOException(String.format("failed to mkdirs '%s' : exists && !isDirectory", file)); 34 | } 35 | } else if (!file.mkdir()) { 36 | throw new IOException(String.format("failed to mkdir '%s'", file)); 37 | } 38 | } 39 | 40 | public static InputStream wrapWithSnappy(InputStream inputStream, boolean useSnappy) 41 | throws IOException { 42 | if (useSnappy) { 43 | return new SnappyInputStream(inputStream, true); 44 | } else { 45 | return inputStream; 46 | } 47 | } 48 | 49 | public static OutputStream wrapWithSnappy(OutputStream outputStream, boolean useSnappy) 50 | throws IOException { 51 | if (useSnappy) { 52 | return new SnappyOutputStream(outputStream); 53 | } else { 54 | return outputStream; 55 | } 56 | } 57 | 58 | /** 59 | * After a successful call, a directory with the given pathname will exist. 60 | * Uses {@link File#mkdirs()} to create the directory, if it doesn't exist 61 | * yet. 62 | */ 63 | public static void mkdirs(@NotNull File file) throws IOException { 64 | if (file.exists()) { 65 | if (!file.isDirectory()) { 66 | throw new IOException(String.format("failed to mkdirs '%s' : exists && !isDirectory", file)); 67 | } 68 | } else if (!file.mkdirs()) { 69 | throw new IOException(String.format("failed to mkdirs '%s'", file)); 70 | } 71 | } 72 | 73 | /** 74 | * Creates new file with a given full file name. If a file with the same 75 | * path & name exists then it will be deleted first 76 | * 77 | * @param file full file name 78 | * @throws IOException if delete or create file operation fails 79 | */ 80 | public static void createOrReplaceFile(File file) throws IOException { 81 | if (file.exists()) { 82 | LOG.warn("File exists already: {}", file.getAbsolutePath()); 83 | if (!file.delete()) { 84 | throw new IOException("Failed to delte file: " + file.getAbsolutePath()); 85 | } 86 | } 87 | 88 | if (!file.createNewFile()) { 89 | throw new IOException("Failed to create new file: " + file.getAbsolutePath()); 90 | } 91 | } 92 | 93 | public static void moveToDirectory(@NotNull File from, @NotNull File dirTo) throws IOException { 94 | assertDirectoryExists(dirTo); 95 | File to = new File(dirTo, from.getName()); 96 | renameTo(from, to); 97 | } 98 | 99 | public static void renameTo(@NotNull File from, @NotNull File to) throws IOException { 100 | assertExists(from); 101 | assertNotExist(to); 102 | if (!from.renameTo(to)) { 103 | throw new IOException(String.format("failed to rename '%s' to '%s'", from, to)); 104 | } 105 | } 106 | 107 | /** 108 | * After a successful call, a file (directory) with the given pathname won't 109 | * exist. The directory must be empty in order to be deleted. 110 | *

111 | * 112 | * @throws IOException if operation failed 113 | */ 114 | public static void delete(@NotNull File file) throws IOException { 115 | if (file.exists() && !file.delete()) { 116 | if (file.exists()) { 117 | throw new IOException(String.format("failed to delete '%s'", file)); 118 | } 119 | } 120 | } 121 | 122 | /** 123 | * After a successful call, inner non-directory files will be disappear 124 | *

125 | * 126 | * @throws IOException if operation failed 127 | */ 128 | public static void deleteInnerFiles(@NotNull File file) throws IOException { 129 | if (file.exists() && file.isDirectory()) { 130 | for (File f : file.listFiles()) { 131 | if (f.isFile()) { 132 | delete(f); 133 | } 134 | } 135 | } 136 | } 137 | 138 | /** 139 | * After a successful call, a directory will be empty 140 | *

141 | * 142 | * @throws IOException if operation failed 143 | */ 144 | public static void deleteRecursivelyInner(@NotNull File file) throws IOException { 145 | if (file.exists() && file.isDirectory()) { 146 | for (File f : file.listFiles()) { 147 | deleteRecursively(f); 148 | } 149 | } 150 | } 151 | 152 | /** 153 | * Tries to delete a file (directory) with the given pathname and logs 154 | * failed attempts. The directory must be empty in order to be deleted. 155 | */ 156 | public static void deleteQuietly(File file) { 157 | try { 158 | delete(file); 159 | } catch (IOException e) { 160 | LOG.warn(e.getMessage()); 161 | } 162 | } 163 | 164 | /** 165 | * After a successful call, a file (directory) with the given pathname won't 166 | * exist. This method also works with non-empty directories. 167 | *

168 | * 169 | * @throws IOException if operation failed 170 | */ 171 | public static void deleteRecursively(@NotNull File file) throws IOException { 172 | if (file.exists()) { 173 | if (file.isDirectory()) { 174 | File[] childFiles = file.listFiles(); 175 | if (childFiles != null) { 176 | for (File childFile : childFiles) { 177 | deleteRecursively(childFile); 178 | } 179 | } 180 | } 181 | delete(file); 182 | } 183 | } 184 | 185 | /** 186 | * Throws an exception if a file (directory) with the given pathname doesn't 187 | * exist. 188 | *

189 | * 190 | * @throws IOException if file doesn't exist 191 | */ 192 | public static void assertExists(@NotNull File file) throws IOException { 193 | if (!file.exists()) { 194 | throw new IOException(String.format("file '%s' doesn't exist", file)); 195 | } 196 | } 197 | 198 | /** 199 | * Throws an exception if the given pathname doesn't denote an existing 200 | * normal file. 201 | *

202 | * 203 | * @throws IOException if file doesn't exist 204 | */ 205 | public static void assertFileExists(@NotNull File file) throws IOException { 206 | if (!file.exists()) { 207 | throw new IOException(String.format("file '%s' doesn't exist", file)); 208 | } 209 | if (!file.isFile()) { 210 | throw new IOException(String.format("file '%s' isn't a normal file", file)); 211 | } 212 | } 213 | 214 | public static String read(@NotNull BufferedReader bufferedReader, boolean closeInputStream) throws IOException { 215 | StringBuilder stringBuilder = new StringBuilder(); 216 | try { 217 | char[] buffer = new char[1024 * 1024]; 218 | int size; 219 | while ((size = bufferedReader.read(buffer)) != -1) { 220 | stringBuilder.append(buffer, 0, size); 221 | } 222 | return stringBuilder.toString(); 223 | } catch (EOFException e) { 224 | return stringBuilder.toString(); 225 | } finally { 226 | if (closeInputStream) { 227 | bufferedReader.close(); 228 | } 229 | } 230 | } 231 | 232 | public static String read(@NotNull BufferedReader bufferedReader) throws IOException { 233 | return read(bufferedReader, true); 234 | } 235 | 236 | public static String read(@NotNull InputStream stream) throws IOException { 237 | return read(new BufferedReader(new InputStreamReader(stream)), true); 238 | } 239 | 240 | public static String read(@NotNull InputStream stream, boolean closeInputStream) throws IOException { 241 | return read(new BufferedReader(new InputStreamReader(stream)), closeInputStream); 242 | } 243 | 244 | @NotNull 245 | public static String read(@NotNull File file) throws IOException { 246 | BufferedReader bufferedReader = openBufferReader(file); 247 | StringBuilder stringBuilder = new StringBuilder(); 248 | try { 249 | char[] buffer = new char[1024 * 1024]; 250 | int size; 251 | while ((size = bufferedReader.read(buffer)) != -1) { 252 | stringBuilder.append(buffer, 0, size); 253 | } 254 | return stringBuilder.toString(); 255 | } catch (EOFException e) { 256 | return stringBuilder.toString(); 257 | } finally { 258 | bufferedReader.close(); 259 | } 260 | } 261 | 262 | private static final String POPULAR_EXTENSIONS = "zip,pdf,mp3,jpg,rar,exe,wmv,doc,avi," 263 | + "ppt,mpg,tif,wav,mov,psd,wma,sitx,sit,eps,cdr,ai,xls,mp4,txt,m4a,rmvb,bmp,pps," 264 | + "aif,pub,dwg,gif,qbb,mpeg,indd,swf,asf,png,dat,rm,mdb,chm,jar,htm,dvf,dss,dmg,iso," 265 | + "flv,wpd,cda,m4b,7z,gz,fla,qxd,rtf,aiff,msi,jpeg,3gp,cdl,vob,ace,m4p,divx,html,pst," 266 | + "cab,ttf,xtm,hqx,qbw,sea,ptb,bin,mswmm,ifo,tgz,log,dll,mcd,ss,m4v,eml,mid,ogg,ram," 267 | + "lnk,torrent,ses,mp2,vcd,bat,asx,ps,bup,cbr,amr,wps,sql,docx,xlsx,pptx,csv,json,bin"; 268 | private static final Set EXTENSIONS = new ObjectOpenHashSet<>( 269 | Arrays.asList(POPULAR_EXTENSIONS.split(","))); 270 | 271 | public static File getFileWithSuffix(File dir, File input, String suffix) { 272 | String name = input.getName(); 273 | int index = name.lastIndexOf('.'); 274 | if (index > 0) { 275 | String extendsion = name.substring(index + 1); 276 | if (EXTENSIONS.contains(extendsion)) { 277 | name = name.substring(0, index) + "." + suffix + "." + extendsion; 278 | } else { 279 | name = name + "." + suffix; 280 | } 281 | } else { 282 | name = name + "." + suffix; 283 | } 284 | return new File(dir, name); 285 | } 286 | 287 | public static File getFileWithSuffix(File input, String suffix) { 288 | return getFileWithSuffix(input.getParentFile(), input, suffix); 289 | } 290 | 291 | /** 292 | * Method reads last line from file if file exists and not empty. 293 | *

294 | * 295 | * @param path file to read 296 | * @return last line in file, null in case of empty file 297 | *

298 | * @throws IOException 299 | */ 300 | @Nullable 301 | public static String readLastLine(@NotNull Path path) throws IOException { 302 | String prevLine = null; 303 | try (BufferedReader br = Files.newBufferedReader(path, Charset.forName("UTF-8"))) { 304 | String line; 305 | while ((line = br.readLine()) != null) { 306 | prevLine = line; 307 | } 308 | } 309 | 310 | return prevLine; 311 | } 312 | 313 | @NotNull 314 | public static List readList(@NotNull File file) throws IOException { 315 | List res = new ObjectArrayList<>(); 316 | addLinesToCollection(file, res); 317 | return res; 318 | } 319 | 320 | public static void addLinesToCollection( 321 | @NotNull File file, @NotNull Collection collection) 322 | throws IOException { 323 | String line; 324 | try (BufferedReader bufferedReader = openBufferReader(file)) { 325 | while ((line = bufferedReader.readLine()) != null) { 326 | collection.add(line); 327 | } 328 | bufferedReader.close(); 329 | } catch (EOFException ignored) { 330 | } 331 | } 332 | 333 | @NotNull 334 | public static BufferedWriter write(@NotNull BufferedWriter bw, @NotNull String... values) throws IOException { 335 | for (String val : values) { 336 | bw.append(val); 337 | } 338 | return bw; 339 | } 340 | 341 | @NotNull 342 | public static BufferedWriter writeln(@NotNull BufferedWriter bw, @NotNull String... values) throws IOException { 343 | write(bw, values).newLine(); 344 | return bw; 345 | } 346 | 347 | public static File write(File output, Collection list) throws IOException { 348 | try (BufferedWriter writer = openWriter(output)) { 349 | for (Object obj : list) { 350 | write(writer, obj.toString()).newLine(); 351 | } 352 | writer.close(); 353 | } 354 | return output; 355 | } 356 | 357 | public static File write(File output, Object[] list) throws IOException { 358 | try (BufferedWriter writer = openWriter(output)) { 359 | for (Object obj : list) { 360 | write(writer, obj.toString()).newLine(); 361 | } 362 | writer.close(); 363 | } 364 | return output; 365 | } 366 | 367 | /** 368 | * Throws an exception if the given pathname doesn't denote an existing 369 | * directory. 370 | *

371 | * 372 | * @throws IOException if file doesn't exist 373 | */ 374 | public static void assertDirectoryExists(@NotNull File file) throws IOException { 375 | if (!file.exists()) { 376 | throw new IOException(String.format("file '%s' doesn't exist", file)); 377 | } 378 | if (!file.isDirectory()) { 379 | throw new IOException(String.format("file '%s' isn't a directory", file)); 380 | } 381 | } 382 | 383 | /** 384 | * Throws an exception if a file (directory) with the given pathname exists. 385 | *

386 | * 387 | * @throws IOException if file exist 388 | */ 389 | public static void assertNotExist(@NotNull File file) throws IOException { 390 | if (file.exists()) { 391 | throw new IOException(String.format("file '%s' exists", file)); 392 | } 393 | } 394 | 395 | public static void replaceFile(File src, File dest) throws IOException { 396 | delete(dest); 397 | renameTo(src, dest); 398 | } 399 | 400 | /** 401 | * Calculates the checksum file's pathname for a hadoop SequenceFile denoted 402 | * by the given pathname. 403 | */ 404 | public static File getSequenceFileCrcFile(@NotNull File file) { 405 | return new File(file.getParentFile(), "." + file.getName() + ".crc"); 406 | 407 | } 408 | 409 | public static void copyFileIfExists(File from, File to, int bufferSize) throws IOException { 410 | if (from.exists()) { 411 | copyFile(from, to, bufferSize); 412 | } 413 | } 414 | 415 | public static void linkOrCopyFile(File from, File to, byte[] buffer) throws IOException { 416 | try { 417 | Files.createLink(to.toPath(), from.toPath()); 418 | } catch (IOException ex) { 419 | copyFile(from, to, buffer); 420 | } 421 | } 422 | 423 | public static void linkOrCopyFile(File from, File to, int bufferSize) throws IOException { 424 | try { 425 | Files.createLink(to.toPath(), from.toPath()); 426 | } catch (IOException ex) { 427 | copyFile(from, to, bufferSize); 428 | } 429 | } 430 | 431 | public static void copyFile(@NotNull File from, @NotNull File to, int bufferSize) throws IOException { 432 | if (bufferSize <= 0) { 433 | throw new IllegalArgumentException("bufferSize <= 0"); 434 | } 435 | assertFileExists(from); 436 | assertNotExist(to); 437 | copyFile(from, to, new byte[bufferSize]); 438 | } 439 | 440 | public static void copyFile(@NotNull File from, @NotNull File to) throws IOException { 441 | assertFileExists(from); 442 | copyFile(from, to, new byte[DEFAULT_BUFFER_SIZE]); 443 | } 444 | 445 | public static void copy(InputStream input, OutputStream output) throws IOException { 446 | copy(input, output, new byte[DEFAULT_BUFFER_SIZE >>> 2]); 447 | } 448 | 449 | public static void copy(InputStream input, OutputStream output, byte[] buffer) throws IOException { 450 | // we don't need to fill buffer fully before writing it into output, 451 | // because input.read does this almost always - TODO check 452 | int cnt; 453 | while ((cnt = input.read(buffer)) != -1) { 454 | output.write(buffer, 0, cnt); 455 | } 456 | } 457 | 458 | /** 459 | * Closes all streams independently. 460 | */ 461 | public static void closeAll(Iterable closeables) throws IOException { 462 | if (closeables == null) { 463 | return; 464 | } 465 | IOException e2 = null; 466 | for (Closeable closeable : closeables) { 467 | if (closeable == null) { 468 | continue; 469 | } 470 | try { 471 | closeable.close(); 472 | } catch (IOException e) { 473 | e2 = e; 474 | } 475 | } 476 | if (e2 != null) { 477 | throw e2; 478 | } 479 | } 480 | 481 | /** 482 | * Closes all streams independently. 483 | */ 484 | public static void closeAll(Closeable... closeables) throws IOException { 485 | if (closeables != null) { 486 | closeAll(Arrays.asList(closeables)); 487 | } 488 | } 489 | 490 | private static void copyFile(File from, File to, byte[] buffer) throws IOException { 491 | FileInputStream input = null; 492 | FileOutputStream output = null; 493 | try { 494 | input = new FileInputStream(from); 495 | output = new FileOutputStream(to); 496 | copy(input, output, buffer); 497 | } finally { 498 | closeAll(input, output); 499 | } 500 | } 501 | 502 | public static void linkOrCopyRecursively(File from, File to, int bufferSize) throws IOException { 503 | assertExists(from); 504 | assertNotExist(to); 505 | linkOrCopyRecursively(from, to, new byte[bufferSize]); 506 | } 507 | 508 | private static void linkOrCopyRecursively(File from, File to, byte[] buffer) throws IOException { 509 | if (from.isDirectory()) { 510 | FileUtils.mkdir(to); 511 | File[] childFiles = from.listFiles(); 512 | if (childFiles != null) { 513 | for (File childFile : childFiles) { 514 | linkOrCopyRecursively(childFile, new File(to, childFile.getName()), buffer); 515 | } 516 | } 517 | } else { 518 | linkOrCopyFile(from, to, buffer); 519 | } 520 | } 521 | 522 | public static void copyRecursively(@NotNull File from, @NotNull File to, int bufferSize) throws IOException { 523 | if (bufferSize <= 0) { 524 | throw new IllegalArgumentException("bufferSize <= 0"); 525 | } 526 | assertExists(from); 527 | assertNotExist(to); 528 | copyRecursively(from, to, new byte[bufferSize]); 529 | } 530 | 531 | /** 532 | * Copies fromDir/* to toDir/ recursively. Overwrites existing files. 533 | *

534 | * 535 | * @throws IOException 536 | */ 537 | public static void copyDirectoryContents(File fromDir, File toDir, int bufferSize) throws IOException { 538 | if (fromDir == null) { 539 | throw new IllegalArgumentException("fromDir is null"); 540 | } 541 | if (toDir == null) { 542 | throw new IllegalArgumentException("toDir is null"); 543 | } 544 | if (!fromDir.equals(toDir)) { 545 | if (bufferSize <= 0) { 546 | throw new IllegalArgumentException("bufferSize <= 0"); 547 | } 548 | assertDirectoryExists(fromDir); 549 | mkdirs(toDir); 550 | copyRecursively(fromDir, toDir, new byte[bufferSize]); 551 | } 552 | } 553 | 554 | public static void copyDirectoryContents(File fromDir, File toDir) throws IOException { 555 | copyDirectoryContents(fromDir, toDir, DEFAULT_BUFFER_SIZE); 556 | } 557 | 558 | public static void copyFileToDirectory(File fromFile, File toDir) throws IOException { 559 | copyContent(fromFile, new File(toDir, fromFile.getName())); 560 | } 561 | 562 | private static void copyRecursively(File from, File to, byte[] buffer) throws IOException { 563 | if (from.isDirectory()) { 564 | FileUtils.mkdir(to); 565 | File[] childFiles = from.listFiles(); 566 | if (childFiles != null) { 567 | for (File childFile : childFiles) { 568 | copyRecursively(childFile, new File(to, childFile.getName()), buffer); 569 | } 570 | } 571 | } else { 572 | copyFile(from, to, buffer); 573 | } 574 | } 575 | 576 | private FileUtils() { 577 | } 578 | 579 | @NotNull 580 | public static File removeSuffix(@NotNull File file, @NotNull String suffix) throws IOException { 581 | if (suffix.isEmpty()) { 582 | throw new IllegalArgumentException("Suffix to remove is empty. File: " + file.getCanonicalPath()); 583 | } 584 | String path = file.getCanonicalPath(); 585 | if (!path.endsWith(suffix)) { 586 | throw new IllegalArgumentException("File doesn't ends with " + suffix 587 | + ". File: " + file.getCanonicalPath()); 588 | } 589 | 590 | path = path.substring(0, path.length() - suffix.length()); 591 | File renamed = new File(path); 592 | FileUtils.renameTo(file, renamed); 593 | return renamed; 594 | } 595 | 596 | @NotNull 597 | public static File addSuffix(@NotNull File file, @NotNull String suffix) throws IOException { 598 | if (suffix.isEmpty()) { 599 | throw new IllegalArgumentException("Suffix to remove is empty. File: " + file.getCanonicalPath()); 600 | } 601 | String path = file.getCanonicalPath(); 602 | if (path.endsWith(suffix)) { 603 | throw new IllegalArgumentException("File ends with " + suffix 604 | + " already. File: " + file.getCanonicalPath()); 605 | } 606 | File renamed = new File(path + suffix); 607 | FileUtils.renameTo(file, renamed); 608 | return renamed; 609 | } 610 | 611 | public static boolean writeTo(@NotNull BufferedWriter br, boolean first, @NotNull String line) 612 | throws IOException { 613 | if (first) { 614 | first = false; 615 | } else { 616 | br.newLine(); 617 | } 618 | br.write(line); 619 | 620 | return first; 621 | } 622 | 623 | public static void assertNotInFolder(@NotNull FilenameFilter filterToProhibit, @NotNull File... folders) 624 | throws IOException { 625 | for (File folder : folders) { 626 | String[] names = folder.list(filterToProhibit); 627 | if (names == null) { 628 | throw new IOException(folder + " is not a directory"); 629 | } else { 630 | if (names.length > 0) { 631 | throw new IOException(folder + " contains prohibited files"); 632 | } 633 | } 634 | } 635 | } 636 | 637 | public static void setPermissionsRecursively( 638 | @NotNull Path path, @NotNull Set permissions) throws IOException { 639 | Files.walkFileTree(path, new RecursivePermissionUpdater(permissions)); 640 | } 641 | 642 | private static class RecursivePermissionUpdater extends SimpleFileVisitor { 643 | 644 | private final Set permissions; 645 | 646 | private RecursivePermissionUpdater(@NotNull Set permissions) { 647 | this.permissions = permissions; 648 | } 649 | 650 | @NotNull 651 | @Override 652 | public FileVisitResult visitFile(@NotNull Path file, @NotNull BasicFileAttributes attrs) throws IOException { 653 | Files.setPosixFilePermissions(file, permissions); 654 | return FileVisitResult.CONTINUE; 655 | } 656 | 657 | @NotNull 658 | @Override 659 | public FileVisitResult postVisitDirectory(@NotNull Path dir, @NotNull IOException exc) throws IOException { 660 | Files.setPosixFilePermissions(dir, permissions); 661 | return FileVisitResult.CONTINUE; 662 | } 663 | 664 | } 665 | 666 | public static void copyIfSourceExists(@NotNull Path source, @NotNull Path destination) throws IOException { 667 | if (Files.exists(source)) { 668 | Files.copy(source, destination, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.COPY_ATTRIBUTES); 669 | } 670 | } 671 | 672 | @NotNull 673 | public static Path getDestination(@NotNull Path symlink) throws IOException { 674 | if (Files.exists(symlink)) { 675 | if (Files.isSymbolicLink(symlink)) { 676 | return Files.readSymbolicLink(symlink); 677 | } else { 678 | throw new IOException(symlink.toString() + " should be symbolic link."); 679 | } 680 | } else { 681 | throw new IOException(symlink.toString() + " doesn't exists."); 682 | } 683 | } 684 | 685 | public static final String DIRECTORY_NAME_TMP = "tmp"; 686 | 687 | /* 688 | * create a not-existed temporary file 689 | * created file will be existed with empty content after this function 690 | */ 691 | public static File tmpFile(File sample, File temp, boolean gzip) throws IOException { 692 | String fileName = sample.getName() + ".tmp"; 693 | String gz = gzip ? ".gz" : ""; 694 | File tmp = new File(temp, fileName + gz); 695 | int id = 0; 696 | while (tmp.exists()) { 697 | tmp = new File(temp, fileName + id + gz); 698 | id++; 699 | } 700 | try { 701 | try (BufferedWriter writer = openWriter(tmp)) { 702 | writer.write(""); 703 | } 704 | } catch (IOException e) { 705 | throw new IOException("Can't create tmp file " + tmp.getPath()); 706 | } 707 | return tmp; 708 | } 709 | 710 | /* 711 | * create a not-existed temporary file 712 | * default is support gzip format 713 | */ 714 | public static File tmpFile(File sample, File temp) throws IOException { 715 | return tmpFile(sample, temp, true); 716 | } 717 | 718 | public static File tmpDir(File sample, File temp) throws IOException { 719 | String fileName = sample.getName() + "_tmp"; 720 | File tmp = new File(temp, fileName); 721 | int id = 0; 722 | while (tmp.exists()) { 723 | tmp = new File(temp, fileName + id); 724 | id++; 725 | } 726 | mkdir(tmp); 727 | return tmp; 728 | } 729 | 730 | /* 731 | * create a not-existed temporary file 732 | */ 733 | public static File tmpFile(File sample, boolean gzip) throws IOException { 734 | File temp = sample.getParentFile(); 735 | if (temp == null) { 736 | throw new IOException("Don't support temporary files for current directory"); 737 | } 738 | File tmpDir = new File(temp, DIRECTORY_NAME_TMP); 739 | if (tmpDir.exists() && tmpDir.isDirectory()) { 740 | temp = tmpDir; 741 | } 742 | return tmpFile(sample, temp, gzip); 743 | } 744 | 745 | public static final String DIRECTORY_NAME_BACKUP = "backup"; 746 | 747 | public static File createBackupFile(File sample, File directory) throws IOException { 748 | String name = sample.getName(); 749 | String extension = ""; 750 | int index = name.lastIndexOf('.'); 751 | if (index >= 0) { 752 | extension = name.substring(index); 753 | name = name.substring(0, index); 754 | } 755 | File backup = new File(directory, name + extension); 756 | int id = 0; 757 | while (backup.exists()) { 758 | backup = new File(directory, name + ".bak" + ++id + extension); 759 | } 760 | com.google.common.io.Files.copy(sample, backup); 761 | return backup; 762 | } 763 | 764 | public static File createBackupFile(File sample) throws IOException { 765 | File directory = sample.getParentFile(); 766 | if (directory != null) { 767 | File backup = new File(directory, DIRECTORY_NAME_BACKUP); 768 | if (backup.exists() && backup.isDirectory()) { 769 | directory = backup; 770 | } 771 | return createBackupFile(sample, directory); 772 | } else { 773 | throw new IOException("Don't support backup for current directory"); 774 | } 775 | } 776 | 777 | private static int DEFAULT_BUFFER_SIZE = 4 * 1024 * 1024; 778 | 779 | public static long copyContent(BufferedReader reader, BufferedWriter writer) throws IOException { 780 | long lines = 0; 781 | while (true) { 782 | try { 783 | String line = reader.readLine(); 784 | if (line == null) { 785 | break; 786 | } 787 | writer.write(line); 788 | writer.newLine(); 789 | lines++; 790 | } catch (EOFException e) { 791 | // ignore this 792 | LOG.warn("Catched EOFException - ", e); 793 | break; 794 | } 795 | } 796 | writer.close(); 797 | return lines; 798 | } 799 | 800 | public static long lines(File file) { 801 | long count = 0; 802 | try { 803 | BufferedReader reader = openBufferReader(file); 804 | for (String line = reader.readLine(); line != null; line = reader.readLine()) { 805 | count++; 806 | } 807 | reader.close(); 808 | } catch (IOException ignore) { 809 | } 810 | return count; 811 | } 812 | 813 | public static long copyContent(File from, BufferedWriter writer) throws IOException { 814 | long lines; 815 | try (BufferedReader reader = openBufferReader(from);) { 816 | lines = copyContent(reader, writer); 817 | } 818 | return lines; 819 | } 820 | 821 | // return number of line 822 | public static long copyContent(File from, File to) throws IOException { 823 | long lines; 824 | try (BufferedReader reader = openBufferReader(from); BufferedWriter writer = openWriter(to)) { 825 | lines = copyContent(reader, writer); 826 | } 827 | return lines; 828 | } 829 | 830 | public static boolean isContentEqual(File file1, File file2) throws IOException { 831 | HashCode hash1 = com.google.common.io.Files.hash(file1, Hashing.sha1()); 832 | HashCode hash2 = com.google.common.io.Files.hash(file2, Hashing.sha1()); 833 | return hash1.equals(hash2); 834 | } 835 | 836 | public static BufferedReader openBufferReader(File file) throws IOException { 837 | return openBufferReader(file, false); 838 | } 839 | 840 | public static BufferedReader openBufferReader(InputStream inputStream) throws IOException { 841 | return new BufferedReader(new InputStreamReader(inputStream), DEFAULT_BUFFER_SIZE); 842 | } 843 | 844 | public static BufferedReader openBufferReader(File file, final boolean forceGzip) throws IOException { 845 | if (forceGzip || file.getName().endsWith(".gz")) { 846 | return new BufferedReader(new InputStreamReader(new GZIPInputStream( 847 | new BufferedInputStream(new FileInputStream(file)))), 848 | (int) Math.min(DEFAULT_BUFFER_SIZE, file.length() + 1)); 849 | } else { 850 | return new BufferedReader(new InputStreamReader(openInputStream(file)), 851 | (int) Math.min(DEFAULT_BUFFER_SIZE, file.length() + 1)); 852 | } 853 | } 854 | 855 | public static InputStream openInputStream(File file) throws IOException { 856 | if (file.getName().endsWith(".gz")) { 857 | return new GZIPInputStream(new BufferedInputStream(new FileInputStream(file), DEFAULT_BUFFER_SIZE >> 1)); 858 | } else { 859 | return new BufferedInputStream(new FileInputStream(file), DEFAULT_BUFFER_SIZE); 860 | } 861 | } 862 | 863 | public static InputStream openZipInputStreamFromSingleZippedFile(File file) throws IOException { 864 | ZipInputStream zipInputStream = new ZipInputStream(new BufferedInputStream(new FileInputStream(file))); 865 | zipInputStream.getNextEntry(); 866 | return zipInputStream; 867 | } 868 | 869 | public static OutputStream openOutputStream(File file) throws IOException { 870 | if (file.getName().endsWith(".gz")) { 871 | return new GZIPOutputStream(new BufferedOutputStream(new FileOutputStream(file), DEFAULT_BUFFER_SIZE >>> 1)) { 872 | { 873 | def.setLevel(Deflater.BEST_SPEED); 874 | } 875 | 876 | }; 877 | } else { 878 | return new BufferedOutputStream(new FileOutputStream(file), DEFAULT_BUFFER_SIZE); 879 | } 880 | } 881 | 882 | /** 883 | * Open a print stream to write into a file 884 | *

885 | * 886 | * @param file 887 | * @return 888 | */ 889 | public static BufferedWriter openWriter(File file) throws IOException { 890 | return openWriter(openOutputStream(file)); 891 | } 892 | 893 | public static BufferedWriter openWriter(OutputStream outputStream) throws IOException { 894 | return new BufferedWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8), DEFAULT_BUFFER_SIZE); 895 | } 896 | 897 | /** 898 | * Open print stream to append into a file 899 | */ 900 | public static BufferedWriter openAppendWriter(File file) throws Exception { 901 | if (!file.getName().endsWith(".gz")) { 902 | return new BufferedWriter(new FileWriter(file, true)); 903 | } else { 904 | FileOutputStream fout = new FileOutputStream(file, true); 905 | GZIPOutputStream zstream = new GZIPOutputStream(fout, DEFAULT_BUFFER_SIZE >>> 1) { 906 | { 907 | def.setLevel(Deflater.BEST_SPEED); 908 | } 909 | 910 | }; 911 | return new BufferedWriter(new OutputStreamWriter(zstream), DEFAULT_BUFFER_SIZE); 912 | } 913 | } 914 | 915 | 916 | public static void appendContentToFile(File inputfile, File outputFile) throws Exception { 917 | BufferedWriter newWriter = openAppendWriter(outputFile); 918 | copyContent(inputfile, newWriter); 919 | 920 | } 921 | 922 | /** 923 | * including sub-directory's children, too 924 | */ 925 | public static Iterator getChildrenFileIteration(final File file) { 926 | final Queue queue = new LinkedList<>(); 927 | if (file != null && file.exists() && file.isDirectory()) { 928 | queue.add(file); 929 | } 930 | return new Iterator() { 931 | @Override 932 | public boolean hasNext() { 933 | return queue.size() > 0; 934 | } 935 | 936 | @Override 937 | public File next() { 938 | File file = queue.poll(); 939 | if (file != null && file.isDirectory()) { 940 | queue.addAll(Arrays.asList(file.listFiles())); 941 | } 942 | return file; 943 | } 944 | }; 945 | } 946 | 947 | public static void zipFiles(List inputs, File zipFile) throws IOException { 948 | zipFiles(inputs, zipFile, false); 949 | } 950 | 951 | public static void zipFiles(List inputs, File zipFile, boolean deleteAfterZip) throws IOException { 952 | FileOutputStream fout = null; 953 | ZipOutputStream zout = null; 954 | for (File file : inputs) { 955 | if (file == null || !file.exists()) { 956 | continue; 957 | } 958 | if (fout == null) { 959 | fout = new FileOutputStream(zipFile); 960 | zout = new ZipOutputStream(new BufferedOutputStream(fout)); 961 | } 962 | byte[] buffer = new byte[100 * 1024]; 963 | InputStream fin = openInputStream(file); 964 | zout.putNextEntry(new ZipEntry(file.getName())); 965 | int length; 966 | while ((length = fin.read(buffer)) > 0) { 967 | zout.write(buffer, 0, length); 968 | } 969 | zout.closeEntry(); 970 | fin.close(); 971 | } 972 | if (zout != null) { 973 | zout.close(); 974 | } 975 | if (deleteAfterZip) { 976 | for (File file : inputs) { 977 | delete(file); 978 | } 979 | } 980 | } 981 | 982 | public static void main(String[] args) throws Exception { 983 | File zipFile = new File("/home/tungmeo/test/test.zip"); 984 | 985 | ZipInputStream zipInputStream = new ZipInputStream(new BufferedInputStream(new FileInputStream(zipFile))); 986 | for (ZipEntry entry = zipInputStream.getNextEntry(); entry != null; entry = zipInputStream.getNextEntry()) { 987 | if (!entry.isDirectory()) { 988 | System.out.println("File:" + entry.getName()); 989 | BufferedReader reader = new BufferedReader(new InputStreamReader(zipInputStream)); 990 | for (String line = reader.readLine(); line != null; line = reader.readLine()) { 991 | System.out.println(line); 992 | } 993 | System.out.println(); 994 | } 995 | } 996 | zipInputStream.closeEntry(); 997 | zipInputStream.close(); 998 | } 999 | 1000 | } 1001 | -------------------------------------------------------------------------------- /src/java/utils/JsonUtils.java: -------------------------------------------------------------------------------- 1 | package utils; 2 | 3 | import com.google.gson.Gson; 4 | import com.google.gson.GsonBuilder; 5 | import com.google.gson.JsonSyntaxException; 6 | import com.google.gson.stream.JsonReader; 7 | import it.unimi.dsi.fastutil.objects.ObjectArrayList; 8 | import org.jetbrains.annotations.NotNull; 9 | 10 | import java.io.BufferedWriter; 11 | import java.io.File; 12 | import java.io.IOException; 13 | import java.io.Reader; 14 | import java.util.Arrays; 15 | import java.util.List; 16 | 17 | /** 18 | * Created on 14/11/2015. 19 | */ 20 | public class JsonUtils { 21 | private static final Gson GSON_INLINE = new Gson(); 22 | private static final Gson GSON_PRETTY = new GsonBuilder().setPrettyPrinting().create(); 23 | 24 | public static String toJsonInline(Object obj) { 25 | return GSON_INLINE.toJson(obj); 26 | } 27 | 28 | public static String toJsonPretty(Object obj) { 29 | return GSON_PRETTY.toJson(obj); 30 | } 31 | 32 | public static T fromJson(String json, Class classOfT) throws JsonSyntaxException { 33 | return GSON_PRETTY.fromJson(json, classOfT); 34 | } 35 | 36 | public static JsonArrayReader openJsonArrayReader( 37 | final File jsonArrayFile, Class classOfT) throws IOException { 38 | return new JsonArrayReader<>(jsonArrayFile, classOfT); 39 | } 40 | 41 | public static JsonArrayWriter openJsonArrayWriter(final File jsonArrayFile) throws IOException { 42 | return new JsonArrayWriter(jsonArrayFile); 43 | } 44 | 45 | public static void writeArray(Iterable list, final File jsonArrayFile) throws IOException { 46 | JsonArrayWriter writer = openJsonArrayWriter(jsonArrayFile); 47 | try { 48 | writer.writeAll(list); 49 | } finally { 50 | writer.close(); 51 | } 52 | } 53 | 54 | public static void writeArray(T[] list, final File jsonArrayFile) throws IOException { 55 | writeArray(Arrays.asList(list), jsonArrayFile); 56 | } 57 | 58 | public static class JsonArrayReader { 59 | private final JsonReader reader; 60 | private final Gson gson = new Gson(); 61 | private final Class classOfT; 62 | private boolean finish = false; 63 | 64 | public JsonArrayReader(File jsonArrayFile, Class classOfT) throws IOException { 65 | this(FileUtils.openBufferReader(jsonArrayFile), classOfT); 66 | } 67 | 68 | public JsonArrayReader(Reader reader, Class classOfT) throws IOException { 69 | this.reader = new JsonReader(reader); 70 | this.classOfT = classOfT; 71 | this.reader.beginArray(); 72 | } 73 | 74 | public boolean hasNext() throws IOException { 75 | return reader == null ? false : reader.hasNext(); 76 | } 77 | 78 | public T next() throws IOException { 79 | if (finish) { 80 | return null; 81 | } else if (reader.hasNext()) { 82 | return gson.fromJson(reader, classOfT); 83 | } else { 84 | finish = true; 85 | reader.endArray(); 86 | } 87 | return null; 88 | } 89 | 90 | public List readAll() throws IOException { 91 | try { 92 | List result = new ObjectArrayList<>(); 93 | for (T val = next(); val != null; val = next()) { 94 | result.add(val); 95 | } 96 | return result; 97 | } finally { 98 | reader.close(); 99 | } 100 | } 101 | 102 | public void close() throws IOException { 103 | reader.close(); 104 | } 105 | } 106 | 107 | public static class JsonArrayWriter { 108 | private final BufferedWriter writer; 109 | private int lines = 0; 110 | private boolean isClosed = false; 111 | 112 | private JsonArrayWriter(File file) throws IOException { 113 | this.writer = FileUtils.openWriter(file); 114 | this.writer.write("["); 115 | } 116 | 117 | public synchronized void write(@NotNull Object object) throws IOException { 118 | if (lines > 0) { 119 | writer.write(","); 120 | writer.newLine(); 121 | } 122 | writer.write(toJsonInline(object)); 123 | lines++; 124 | } 125 | 126 | public synchronized void writeAll(Iterable list) throws IOException { 127 | for (T object : list) { 128 | write(object); 129 | } 130 | } 131 | 132 | public synchronized void writeAll(T[] list) throws IOException { 133 | for (T object : list) { 134 | write(object); 135 | } 136 | } 137 | 138 | public void close() throws IOException { 139 | if (isClosed) { 140 | return; 141 | } else { 142 | synchronized (this) { 143 | if (!isClosed) { 144 | this.writer.write("]"); 145 | this.writer.close(); 146 | isClosed = true; 147 | } 148 | } 149 | } 150 | 151 | } 152 | } 153 | } 154 | -------------------------------------------------------------------------------- /src/java/utils/RandomUtils.java: -------------------------------------------------------------------------------- 1 | package utils; 2 | 3 | import java.util.UUID; 4 | 5 | /** 6 | * Created on 12/11/2015. 7 | */ 8 | public final class RandomUtils { 9 | private RandomUtils() { 10 | } 11 | 12 | public static String randomUUID() { 13 | return UUID.randomUUID().toString(); 14 | } 15 | 16 | private static String randomByCut(String rand, int maxChars) { 17 | if (rand.length() > maxChars) { 18 | rand = rand.substring(0, maxChars); 19 | } 20 | return rand; 21 | } 22 | 23 | public static String randomUUID(int maxChars) { 24 | String rand = randomUUID(); 25 | return randomByCut(rand, maxChars); 26 | } 27 | 28 | public static String randomShortUUID() { 29 | String rand = randomUUID(); 30 | int id = rand.lastIndexOf('-'); 31 | if (id > 0 && id < rand.length() - 1) { 32 | return rand.substring(id + 1); 33 | } 34 | return rand; 35 | } 36 | 37 | public static String randomUserId() { 38 | String rand = randomUUID(); 39 | StringBuilder uid = new StringBuilder(rand.length()); 40 | for (int i = 0; i < rand.length(); i++) { 41 | if (rand.charAt(i) != '-') { 42 | uid.append(rand.charAt(i)); 43 | } 44 | } 45 | return uid.toString(); 46 | } 47 | 48 | public static void main(String[] args) throws Exception { 49 | System.out.println(randomUserId()); 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /src/java/utils/RuntimeUtils.java: -------------------------------------------------------------------------------- 1 | package utils; 2 | 3 | import java.io.BufferedReader; 4 | import java.io.InputStreamReader; 5 | 6 | public class RuntimeUtils { 7 | 8 | public static String executeLinuxDebianCommand(String[] command) throws Exception { 9 | StringBuilder output = new StringBuilder(); 10 | Process p = Runtime.getRuntime().exec(command); 11 | // p.waitFor(); // use this might cause a deadlock 12 | BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); 13 | String line; 14 | while ((line = reader.readLine()) != null) { 15 | output.append(line).append("\n"); 16 | } 17 | return output.toString(); 18 | } 19 | 20 | public static int getAvailableCores() { 21 | return Runtime.getRuntime().availableProcessors(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/java/utils/StringUtils.java: -------------------------------------------------------------------------------- 1 | package utils; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Arrays; 5 | 6 | /** 7 | * @author tunght 8 | */ 9 | public class StringUtils { 10 | 11 | private static final int OBJ_HEADER; 12 | private static final int ARR_HEADER; 13 | private static final int INT_FIELDS = 12; 14 | private static final int OBJ_REF; 15 | private static final int OBJ_OVERHEAD; 16 | private static final boolean IS_64_BIT_JVM; 17 | 18 | /** 19 | * Class initializations. 20 | */ 21 | static { 22 | // By default we assume 64 bit JVM 23 | // (defensive approach since we will get 24 | // larger estimations in case we are not sure) 25 | 26 | boolean is64BitsJVM = true; 27 | // check the system property "sun.arch.data.model" 28 | // not very safe, as it might not work for all JVM implementations 29 | // nevertheless the worst thing that might happen is that the JVM is 30 | // 32bit 31 | // but we assume its 64bit, so we will be counting a few extra bytes per 32 | // string object 33 | // no harm done here since this is just an approximation. 34 | String arch = System.getProperty("sun.arch.data.model"); 35 | if (arch != null) { 36 | if (arch.indexOf("32") != -1) { 37 | // If exists and is 32 bit then we assume a 32bit JVM 38 | is64BitsJVM = false; 39 | } 40 | } 41 | IS_64_BIT_JVM = is64BitsJVM; 42 | // The sizes below are a bit rough as we don't take into account 43 | // advanced JVM options such as compressed oops 44 | // however if our calculation is not accurate it'll be a bit over 45 | // so there is no danger of an out of memory error because of this. 46 | OBJ_HEADER = IS_64_BIT_JVM ? 16 : 8; 47 | ARR_HEADER = IS_64_BIT_JVM ? 24 : 12; 48 | OBJ_REF = IS_64_BIT_JVM ? 8 : 4; 49 | OBJ_OVERHEAD = OBJ_HEADER + INT_FIELDS + OBJ_REF + ARR_HEADER; 50 | } 51 | 52 | /** 53 | * Estimates the size of a {@link String} object in bytes. 54 | * 55 | * @param s The string to estimate memory footprint. 56 | * @return The estimated size in bytes. 57 | */ 58 | public static long estimatedSizeOf(String s) { 59 | return (s.length() * 2) + OBJ_OVERHEAD; 60 | } 61 | 62 | /* 63 | * don't count reference point to string 64 | */ 65 | public static long size(String str) { 66 | return (str.length() * 2) + OBJ_OVERHEAD; 67 | } 68 | 69 | public static String getStringFromTokens(String[] tokens, int from, int to) { 70 | return getStringFromTokens(tokens, from, to, ' '); 71 | } 72 | 73 | public static String getStringFromTokens(Iterable tokens) { 74 | return getStringFromTokens(tokens, " "); 75 | } 76 | 77 | public static String getStringFromTokens(Iterable tokens, String split) { 78 | StringBuilder result = new StringBuilder(); 79 | boolean notFirst = false; 80 | for (String token : tokens) { 81 | if (notFirst) { 82 | result.append(split); 83 | } 84 | result.append(token); 85 | notFirst = true; 86 | } 87 | return result.toString(); 88 | } 89 | 90 | public static String getStringFromTokens(String[] tokens) { 91 | return getStringFromTokens(tokens, 0, tokens.length, ' '); 92 | } 93 | 94 | public static String getStringFromTokens(String[] tokens, String split) { 95 | return getStringFromTokens(tokens, 0, tokens.length, split); 96 | } 97 | 98 | public static String getStringFromTokens(String[] tokens, int from, int to, String split) { 99 | StringBuilder rez = new StringBuilder(); 100 | for (int i = from; i < to; i++) { 101 | if (rez.length() > 0) { 102 | rez.append(split); 103 | } 104 | rez.append(tokens[i]); 105 | } 106 | return rez.toString(); 107 | } 108 | 109 | public static String getStringFromTokens(String[] tokens, int from, int to, char split) { 110 | StringBuilder rez = new StringBuilder(); 111 | for (int i = from; i < to; i++) { 112 | if (rez.length() > 0) { 113 | rez.append(split); 114 | } 115 | rez.append(tokens[i]); 116 | } 117 | return rez.toString(); 118 | } 119 | 120 | public static int indexOf(String[] tokens, String token) { 121 | int index = -1; 122 | if (tokens != null) { 123 | for (int i = 0; i < tokens.length; i++) { 124 | if (token == null) { 125 | if (tokens[i] == null) { 126 | index = i; 127 | break; 128 | } 129 | } else if (token.equals(tokens[i])) { 130 | index = i; 131 | break; 132 | } 133 | } 134 | } 135 | return index; 136 | } 137 | 138 | public static boolean contains(String[] tokens, String token) { 139 | return indexOf(tokens, token) >= 0; 140 | } 141 | 142 | public static String getStringFromTokens(String[] tokens, int from) { 143 | return getStringFromTokens(tokens, from, tokens.length); 144 | } 145 | 146 | private static String substring(String str, int from, int to) { 147 | if (from == to) { 148 | return ""; 149 | } 150 | return str.substring(from, to); 151 | } 152 | 153 | public static String[] split(String str, char delim, int max) { 154 | if (max <= 0) { 155 | return splitTrim(str, delim); 156 | } 157 | String[] tokens = new String[max]; 158 | int id = 0; 159 | int start = 0; 160 | int index = str.indexOf(delim); 161 | while (index >= 0 && id < max) { 162 | if (id + 1 == max) { 163 | index = str.length(); 164 | } 165 | if (start <= index) { 166 | tokens[id++] = substring(str, start, index); 167 | } 168 | start = index + 1; 169 | index = str.indexOf(delim, start); 170 | } 171 | if (start <= str.length() && id < max) { 172 | tokens[id++] = substring(str, start, str.length()); 173 | } 174 | if (id < max) { 175 | return Arrays.copyOf(tokens, id); 176 | } 177 | return tokens; 178 | } 179 | 180 | public static String[] split(String str, String delim, int max) { 181 | String[] tokens = new String[max]; 182 | int id = 0; 183 | int start = 0; 184 | int index = str.indexOf(delim); 185 | while (index >= 0 && id < max) { 186 | if (id + 1 == max) { 187 | index = str.length(); 188 | } 189 | if (start <= index) { 190 | tokens[id++] = substring(str, start, index); 191 | } 192 | start = index + delim.length(); 193 | index = str.indexOf(delim, start); 194 | } 195 | if (start <= str.length() && id < max) { 196 | tokens[id++] = substring(str, start, str.length()); 197 | } 198 | if (id < max) { 199 | return Arrays.copyOf(tokens, id); 200 | } 201 | return tokens; 202 | } 203 | 204 | public static String[] splitTrim(String str, char delim, int max) { 205 | if (max <= 0) { 206 | return splitTrim(str, delim); 207 | } 208 | String[] tokens = new String[max]; 209 | int id = 0; 210 | int start = 0; 211 | int index = str.indexOf(delim); 212 | while (index >= 0 && id < max) { 213 | if (id + 1 == max) { 214 | index = str.length(); 215 | } 216 | if (start < index) { 217 | tokens[id++] = substring(str, start, index); 218 | } 219 | start = index + 1; 220 | index = str.indexOf(delim, start); 221 | } 222 | if (start < str.length() && id < max) { 223 | tokens[id++] = substring(str, start, str.length()); 224 | } 225 | if (id < max) { 226 | return Arrays.copyOf(tokens, id); 227 | } 228 | return tokens; 229 | } 230 | 231 | public static String[] splitTrim(String str, String delim, int max) { 232 | if (max <= 0) { 233 | return splitTrim(str, delim); 234 | } 235 | String[] tokens = new String[max]; 236 | int id = 0; 237 | int start = 0; 238 | int index = str.indexOf(delim); 239 | while (index >= 0 && id < max) { 240 | if (id + 1 == max) { 241 | index = str.length(); 242 | } 243 | if (start < index) { 244 | tokens[id++] = substring(str, start, index); 245 | } 246 | start = index + delim.length(); 247 | index = str.indexOf(delim, start); 248 | } 249 | if (start < str.length() && id < max) { 250 | tokens[id++] = substring(str, start, str.length()); 251 | } 252 | if (id < max) { 253 | return Arrays.copyOf(tokens, id); 254 | } 255 | return tokens; 256 | } 257 | 258 | public static String[] split(String str, String delim) { 259 | ArrayList rez = new ArrayList<>(); 260 | int start = 0; 261 | int index = str.indexOf(delim); 262 | while (index >= 0) { 263 | rez.add(substring(str, start, index)); 264 | start = index + delim.length(); 265 | index = str.indexOf(delim, start); 266 | } 267 | if (start <= str.length()) { 268 | rez.add(substring(str, start, str.length())); 269 | } 270 | return rez.toArray(new String[0]); 271 | } 272 | 273 | public static String[] splitTrim(String str, String delim) { 274 | ArrayList rez = new ArrayList<>(); 275 | int start = 0; 276 | int index = str.indexOf(delim); 277 | while (index >= 0) { 278 | if (start < index) { 279 | rez.add(substring(str, start, index)); 280 | } 281 | start = index + delim.length(); 282 | index = str.indexOf(delim, start); 283 | } 284 | if (start < str.length()) { 285 | rez.add(substring(str, start, str.length())); 286 | } 287 | return rez.toArray(new String[0]); 288 | } 289 | 290 | public static String[] split(String str, char delim) { 291 | ArrayList rez = new ArrayList<>(); 292 | int start = 0; 293 | int index = str.indexOf(delim); 294 | while (index >= 0) { 295 | rez.add(substring(str, start, index)); 296 | start = index + 1; 297 | index = str.indexOf(delim, start); 298 | } 299 | if (start <= str.length()) { 300 | rez.add(substring(str, start, str.length())); 301 | } 302 | return rez.toArray(new String[0]); 303 | } 304 | 305 | public static String[] splitTrim(String str, char delim) { 306 | ArrayList rez = new ArrayList<>(); 307 | int start = 0; 308 | int index = str.indexOf(delim); 309 | while (index >= 0) { 310 | if (start < index) { 311 | rez.add(substring(str, start, index)); 312 | } 313 | start = index + 1; 314 | index = str.indexOf(delim, start); 315 | } 316 | if (start < str.length()) { 317 | rez.add(substring(str, start, str.length())); 318 | } 319 | return rez.toArray(new String[0]); 320 | } 321 | 322 | public static String getStringFromObjects(Object delim, Object[] objs) { 323 | StringBuilder rez = new StringBuilder(); 324 | boolean first = true; 325 | for (Object obj : objs) { 326 | if (first) { 327 | first = false; 328 | } else { 329 | rez.append(delim.toString()); 330 | } 331 | rez.append(obj.toString()); 332 | } 333 | return rez.toString(); 334 | } 335 | 336 | public static String getField(final String line, final String sparator, 337 | final int index, final boolean trim) { 338 | if (index <= 0) { 339 | return null; 340 | } 341 | int id = 0, len = line.length(); 342 | if (trim) { 343 | while (line.startsWith(sparator, id)) { 344 | id += sparator.length(); 345 | } 346 | while (line.startsWith(sparator, len - sparator.length())) { 347 | len = len - sparator.length(); 348 | } 349 | } 350 | int count = 0, max = len; 351 | int last = id; 352 | while (count < index) { 353 | count++; 354 | id = line.indexOf(sparator, last); 355 | if (id > 0 && trim) { 356 | int next = id + sparator.length(); 357 | while (next <= len && line.startsWith(sparator, next)) { 358 | id = next; 359 | next += sparator.length(); 360 | } 361 | } 362 | if (id < 0 || id >= max) { 363 | if (count == index) { 364 | id = len; 365 | } 366 | break; 367 | } else if (count < index) { 368 | id += sparator.length(); 369 | last = id; 370 | } 371 | } 372 | String result = id >= last && count == index ? line.substring(last, id) : null; 373 | return result; 374 | } 375 | 376 | public static void main(String[] args) { 377 | } 378 | 379 | } 380 | -------------------------------------------------------------------------------- /src/java/utils/TimestampUtils.java: -------------------------------------------------------------------------------- 1 | package utils; 2 | 3 | import org.joda.time.format.DateTimeFormat; 4 | import org.joda.time.format.DateTimeFormatter; 5 | 6 | import java.text.DateFormat; 7 | import java.text.SimpleDateFormat; 8 | import java.util.Date; 9 | import java.util.TimeZone; 10 | 11 | /** 12 | * Methods for dealing with timestamps 13 | */ 14 | public class TimestampUtils { 15 | 16 | private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormat.forPattern("yyyy_MM_dd"); 17 | private static final TimeZone TIME_ZONE = TimeZone.getDefault(); 18 | 19 | public static final long getTimeZoneOffset(long date, long unit) { 20 | return TIME_ZONE.getOffset(date) / unit; 21 | } 22 | 23 | public static final long getTimeZoneOffset(long date) { 24 | return TIME_ZONE.getOffset(date); 25 | } 26 | 27 | public static String getIsoWithoutUtcRootZone() { 28 | return getIsoWithoutUtcRootZone(System.currentTimeMillis()); 29 | } 30 | 31 | public static String getIsoWithoutUtcRootZone(long timestamp) { 32 | Date now = new Date(timestamp); 33 | return getIsoWithoutUtcRootZone(now); 34 | } 35 | 36 | private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); 37 | 38 | static { 39 | dateFormat.setTimeZone(TimeZone.getTimeZone("England/London")); 40 | } 41 | 42 | private static String getIsoWithoutUtcRootZone(Date date) { 43 | return dateFormat.format(date); 44 | } 45 | 46 | public static DateTimeFormatter getDateTimeFormat(String pattern) { 47 | return DateTimeFormat.forPattern(pattern); 48 | } 49 | 50 | private TimestampUtils() { 51 | } 52 | 53 | public static void main(String[] args) throws Exception { 54 | System.out.println(getIsoWithoutUtcRootZone()); 55 | System.out.println(getTimeZoneOffset(System.currentTimeMillis()) / (3600 * 1000)); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/java/utils/Utils.java: -------------------------------------------------------------------------------- 1 | package utils; 2 | 3 | import java.io.UnsupportedEncodingException; 4 | import java.net.InetAddress; 5 | import java.net.URLDecoder; 6 | import java.net.UnknownHostException; 7 | import java.text.DateFormat; 8 | import java.text.SimpleDateFormat; 9 | import java.util.*; 10 | import java.util.concurrent.TimeUnit; 11 | 12 | public class Utils { 13 | public static String round(double d, int num) { 14 | return String.format(Locale.US, "%." + num + "f", d); 15 | } 16 | 17 | public static String round(double d) { 18 | return String.format(Locale.US, "%.3f", d); 19 | } 20 | 21 | public static double min(double a, double b) { 22 | return (a < b) ? a : b; 23 | } 24 | 25 | public static long double2long(double d) { 26 | if (d > Long.MAX_VALUE) { 27 | return Long.MAX_VALUE; 28 | } 29 | if (d < Long.MIN_VALUE) { 30 | return Long.MIN_VALUE; 31 | } 32 | return (long) d; 33 | } 34 | 35 | public static int double2int(double d) { 36 | if (d > Integer.MAX_VALUE) { 37 | return Integer.MAX_VALUE; 38 | } 39 | if (d < Integer.MIN_VALUE) { 40 | return Integer.MIN_VALUE; 41 | } 42 | return (int) d; 43 | } 44 | 45 | /** 46 | * different in hours between two timestamp 47 | * time must be in format of DATE_FORMAT (yyyy_MM_dd_HH_mm) 48 | * @param time1 49 | * @param time2 50 | * @return 51 | */ 52 | public static long hourdiff(String time1, String time2) { 53 | try { 54 | Date date1 = DATE_FORMAT.parse(time1); 55 | Date date2 = DATE_FORMAT.parse(time2); 56 | 57 | long diff = date2.getTime() - date1.getTime(); 58 | return TimeUnit.MILLISECONDS.toHours(diff); 59 | } catch(Exception e) { 60 | e.printStackTrace(); 61 | } 62 | return 0; 63 | } 64 | 65 | public static long hourElapsed(String time) { 66 | try { 67 | String current = DATE_FORMAT.format(Calendar.getInstance().getTime()); 68 | return hourdiff(time, current); 69 | } catch (Exception e) { 70 | e.printStackTrace(); 71 | } 72 | return 0; 73 | } 74 | 75 | public static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy_MM_dd_HH_mm"); 76 | 77 | /* 78 | * get name with date specific as suffix 79 | */ 80 | public static String getNameWithDateSuffix(String name) { 81 | return name + "_" + DATE_FORMAT.format(Calendar.getInstance().getTime()); 82 | } 83 | 84 | /** 85 | * get current time 86 | * @return formated String of current time 87 | */ 88 | public static String getCurrentDate() { 89 | return DATE_FORMAT.format(Calendar.getInstance().getTime()); 90 | } 91 | 92 | /** 93 | * Check if date1 is after date2 or not 94 | * @param date1 95 | * @param date2 96 | * @return 97 | */ 98 | public static boolean isAfter(String date1, String date2) { 99 | try { 100 | Date d1 = DATE_FORMAT.parse(date1); 101 | Date d2 = DATE_FORMAT.parse(date2); 102 | 103 | return d1.after(d2); 104 | } catch(Exception e) { 105 | e.printStackTrace(); 106 | return false; 107 | } 108 | } 109 | 110 | 111 | /* 112 | * get name with date specific as suffix 113 | */ 114 | public static String getNameWithDateSuffix(String name, boolean zip) { 115 | if (!zip) { 116 | return getNameWithDateSuffix(name); 117 | } 118 | return name + "_" + DATE_FORMAT.format(Calendar.getInstance().getTime()) + ".gz"; 119 | } 120 | 121 | public static String getStringFromTokens(String[] tokens, int start, int end, StringBuilder cache) { 122 | if (cache == null) { 123 | cache = new StringBuilder(); 124 | } else { 125 | cache.setLength(0); 126 | } 127 | for (int i = start; i < end; i++) { 128 | if (cache.length() > 0) { 129 | cache.append(' '); 130 | } 131 | cache.append(tokens[i]); 132 | } 133 | return cache.toString(); 134 | } 135 | 136 | public static String getStringFromTokens(String[] tokens, int start, int end) { 137 | return getStringFromTokens(tokens, start, end, null); 138 | } 139 | 140 | public static void toJson(String s, StringBuilder result) { 141 | for (int i = 0; i < s.length(); i++) { 142 | char c = s.charAt(i); 143 | switch (c) { 144 | case '"': 145 | case '/': 146 | case '\\': 147 | result.append('\\').append(c); 148 | break; 149 | case '\b': 150 | result.append("\\b"); 151 | break; 152 | case '\f': 153 | result.append("\\f"); 154 | break; 155 | case '\n': 156 | result.append("\\n"); 157 | break; 158 | case '\r': 159 | result.append("\\r"); 160 | break; 161 | case '\t': 162 | result.append("\\t"); 163 | break; 164 | default: 165 | result.append(c); 166 | } 167 | } 168 | } 169 | 170 | public static String toJson(String s) { 171 | StringBuilder result = new StringBuilder(s.length() + 2); 172 | toJson(s, result); 173 | return result.toString(); 174 | } 175 | 176 | /** 177 | * rewrite String.startswith for speeding up 178 | */ 179 | private static boolean startsWith(String s, String prefix) { 180 | if (s.length() < prefix.length()) { 181 | return false; 182 | } 183 | for (int i = 0; i < prefix.length(); i++) { 184 | if (prefix.charAt(i) != s.charAt(i)) { 185 | return false; 186 | } 187 | } 188 | return true; 189 | } 190 | 191 | /** 192 | * www[0-9]*.site -> site 193 | */ 194 | public static String normalize(String site) { 195 | site = site.toLowerCase(); 196 | if (startsWith(site, "www")) { 197 | int pos = 3; 198 | while (pos < site.length() 199 | && site.charAt(pos) >= '0' && site.charAt(pos) <= '9') { 200 | pos++; 201 | } 202 | if (pos + 1 < site.length() && site.charAt(pos) == '.') { 203 | return site.substring(pos + 1); 204 | } 205 | } 206 | return site; 207 | } 208 | 209 | /** 210 | * check hash before using default equal function 211 | */ 212 | public static boolean equalUsingHash(String str1, String str2) { 213 | if (str1 == null || str2 == null) { 214 | return false; 215 | } 216 | if (str1.hashCode() != str2.hashCode()) { 217 | return false; 218 | } 219 | return str1.equals(str2); 220 | } 221 | 222 | /* 223 | * get real local host name of running code 224 | * ex: searcher1g.dev.itim.vn 225 | */ 226 | public static String getLocalHostName() throws UnknownHostException { 227 | return InetAddress.getLocalHost().getCanonicalHostName(); 228 | } 229 | 230 | public static String getLocalHostName(String defaultName) { 231 | try { 232 | return InetAddress.getLocalHost().getCanonicalHostName(); 233 | } catch (UnknownHostException e) { 234 | return defaultName; 235 | } 236 | } 237 | 238 | /* 239 | * get available cores from current OS 240 | * use this value for spawning a suitable number of threads (as average, best number is available cores) 241 | */ 242 | public static int getAvailableCores() { 243 | return Runtime.getRuntime().availableProcessors(); 244 | } 245 | 246 | /* 247 | * get free heap memory of JVM 248 | */ 249 | public static long getFreeMem() { 250 | return Runtime.getRuntime().freeMemory(); 251 | } 252 | 253 | /* 254 | * get map between param and value base on format "param1=value1¶m2=value2..." 255 | * note that requestPath has url encoding (ansii) 256 | */ 257 | public static Map getParamsFromRequestPath(String requestPath, int startIndex) 258 | throws UnexpectedResultException, UnsupportedEncodingException { 259 | Map params = new HashMap<>(); 260 | StringBuilder param = new StringBuilder(); 261 | int lastIndex = requestPath.length() - 1; 262 | for (int i = startIndex; i <= lastIndex; i++) { 263 | if (requestPath.charAt(i) == '&') { 264 | if (param.length() == 0) { 265 | continue; 266 | } 267 | String pair = param.toString(); 268 | int index = pair.indexOf('='); 269 | if (index < 0) { 270 | throw new UnexpectedResultException("invalid param '" + pair + "' of request '" + requestPath + "'"); 271 | } 272 | params.put(pair.substring(0, index), URLDecoder.decode(pair.substring(index + 1), "UTF-8")); 273 | param.setLength(0); 274 | } else { 275 | param.append(requestPath.charAt(i)); 276 | if (i == lastIndex) { 277 | String pair = param.toString(); 278 | int index = pair.indexOf('='); 279 | if (index < 0) { 280 | throw new UnexpectedResultException("invalid param '" + pair + "' of request '" + requestPath + "'"); 281 | } 282 | params.put(pair.substring(0, index), URLDecoder.decode(pair.substring(index + 1), "UTF-8")); 283 | } 284 | } 285 | } 286 | return params; 287 | } 288 | 289 | 290 | public static List addAllStringArray(List source, String[] array) { 291 | for(int i=0; i T instantiate(final String className, final Class type){ 308 | try{ 309 | return type.cast(Class.forName(className).newInstance()); 310 | } catch(final InstantiationException e){ 311 | throw new IllegalStateException(e); 312 | } catch(final IllegalAccessException e){ 313 | throw new IllegalStateException(e); 314 | } catch(final ClassNotFoundException e){ 315 | throw new IllegalStateException(e); 316 | } 317 | } 318 | } 319 | -------------------------------------------------------------------------------- /src/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | groupId 8 | recsys4all 9 | 1.0-SNAPSHOT 10 | 11 | 12 | 13 | com.github.fommil.netlib 14 | all 15 | 1.1.2 16 | pom 17 | 18 | 19 | com.googlecode.matrix-toolkits-java 20 | mtj 21 | 1.0.1 22 | 23 | 24 | com.googlecode.efficient-java-matrix-library 25 | core 26 | 0.26 27 | 28 | 29 | com.googlecode.efficient-java-matrix-library 30 | equation 31 | 0.26 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /src/src.eml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | --------------------------------------------------------------------------------