Subscribe to RSS Feed ログイン

オーガニック・ウェルス

Saturday
2018年4月21日

JSLintの考察

最近JSLintというチェックの仕組みを導入してコーディングを行っているが、

インクリメント演算子の使用でエラーが出てしまっていた。

参考:http://analogic.jp/jslint-options-plusplus/

どうも脆弱性に繋がるため使用は避けたほうが良いとのことだが、

for(i = 0;i < len;i++)の様なときには簡潔な気塾ができないなど弊害が多い

どの様にしたほうが良いだろうか。

コメント(0)続きを読む

K-means手法でのクラスタリングテスト

一般的なK-meansの手法を使ったクラスタリングのサンプルです。
初期に割り当てるクラスタがランダムのため、実行するたびにクラスタ割り当ての結果が変わっています。

Javascript及びHTML5で作成しています。

こちらからサンプルを実行できます。

 

コメント(0)続きを読む

Cygwinにscreen4.1をインストール

$ apt-cyg install autoconf automake libncurses-devel
$ git clone git://git.sv.gnu.org/screen.git
$ cd screen/src

ansi.cを修正します。

2930c2930
<       if (p->encoding == UTF8)
---
>       if (p->w_encoding == UTF8)
$ sh autogen.sh
$ ./configure
$ make
$ make install

参考

GNU Screen開発版(4.1.0)でビルド時にエラー

 

コメント(0)続きを読む

MySQLでRestoreするときの文字化け対策


> mysql --default-character-set=utf8 -u user -p database < dump.sql

関連
MySQLをAccessで使った時の文字化け解消方法

※余談 ・・・ WordPressでは連続したハイフンを入力すると文字化けるのでcodeやpreタグで囲むこと

コメント(0)続きを読む

PHP5.5 alpha2をCentOSでビルド

バージョンの確認


# cat /etc/redhat-release && arch
CentOS release 6.3 (Final)
x86_64

# yum install -y libxml2-devel libpng-devel libmcrypt libmcrypt-devel libtool-ltdl libtool-ltdl-devel httpd-devel libjpeg-devel openssl-devel pcre-devel bzip2-devel libXpm-devel freetype-devel gmp-devel
# wget http://downloads.php.net/dsp/php-5.5.0alpha2.tar.bz2
# tar xvf php-5.5.0alpha2.tar.bz2
# cd php-5.5.0alpha2
# ./configure \
–build=x86_64-redhat-linux-gnu \
–host=x86_64-redhat-linux-gnu \
–target=x86_64-redhat-linux-gnu \
–program-prefix= \
–prefix=/usr \
–exec-prefix=/usr \
–bindir=/usr/bin \
–sbindir=/usr/sbin \
–sysconfdir=/etc \
–datadir=/usr/share \
–includedir=/usr/include \
–libdir=/usr/lib64 \
–libexecdir=/usr/libexec \
–localstatedir=/var \
–sharedstatedir=/var/lib \
–mandir=/usr/share/man \
–infodir=/usr/share/info \
–cache-file=../config.cache \
–with-libdir=lib64 \
–with-config-file-path=/etc \
–with-config-file-scan-dir=/etc/php.d \
–disable-debug \
–with-pic \
–disable-rpath \
–with-pear \
–with-bz2 \
–with-freetype-dir=/usr \
–with-png-dir=/usr \
–with-xpm-dir=/usr \
–enable-gd-native-ttf \
–without-gdbm \
–with-gettext \
–with-gmp \
–with-iconv \
–with-jpeg-dir=/usr \
–with-openssl \
–with-pcre-regex=/usr \
–with-zlib \
–with-layout=GNU \
–with-kerberos \
–enable-exif \
–enable-ftp \
–enable-sockets \
–enable-sysvsem \
–enable-sysvshm \
–enable-sysvmsg \
–enable-shmop \
–enable-calendar \
–with-libxml-dir=/usr \
–enable-xml \
–enable-pdo \
–enable-json \
–enable-mbstring \
–enable-mbregex \
–with-apxs2=/usr/sbin/apxs \
–with-mysql \
–with-gd \
–with-pdo-mysql \
–without-unixODBC \
–with-sqlite3 \
–without-pspell \
–without-curl \
–disable-posix \
–disable-sysvmsg \
–disable-sysvshm \
–disable-sysvsem \
–disable-wddx \
–disable-phar \
–disable-fileinfo \
–disable-xmlreader \
–disable-xmlwriter \
–disable-dom \
–disable-dba
# make
# make test
# make install

PHP5.5の新機能であるジェネレーターなどを試してみたいです。

コメント(0)続きを読む

インラインアセンブラでSSE

<sse3.c>

#include <stdio.h>
#include <stdlib.h>
float a[4] asm ("a")__attribute__((aligned(16))) ={0.0,0.0,0.0,0.0};
int main()
{
	float* c;
	int size_of_float = sizeof(float); // 32bit
	int num = 1024,i=0,limit;
	c = (float*)malloc(size_of_float * num);
	for(i = 0;i < num;i++){
		c[i] = i + 1;
	}
	//  aはアラインメントされているのでmovaps
	asm("movaps a,%xmm0");
	limit = num / 4;
	for(i = 0;i < limit;i++) {
		// cはアラインメントされていないのでmovups
		asm("movups (%0),%%xmm1"::"r"(c + i * size_of_float));
		asm("addps %xmm1,%xmm0");
	}
	asm("movaps %xmm0, a");

	printf("sum = %f\n",a[0] + a[1] + a[2] + a[3]);
	free(c);
	return 0;
}

$ gcc -o sse3 sse3.c
$ ./sse3

sum = 524800.000000

コメント(0)続きを読む

インラインアセンブラを試す

まずOSの情報を表示します。

# cat /proc/cpuinfo

processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 44
model name      : Intel(R) Xeon(R) CPU           X5675  @ 3.07GHz
stepping        : 2
cpu MHz         : 3066.450
cache size      : 4096 KB
fpu             : yes
fpu_exception   : yes
cpuid level     : 11
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush mmx
fxsr sse sse2 ss syscall nx lm constant_tsc up unfair_spinlock pni pclmulqdq ssse3 cx16
 sse4_1 sse4_2 popcnt aes hypervisor lahf_lm
bogomips        : 6132.90
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

さくらのクラウドでは上記のようなスペックになっています。
以下のサイトのコードをgcc様に書き換えて実行してみます。
http://www.isus.jp/article/compileroptimization/compiler_part1/

<inline_asm.c>

#include<stdio.h>

int a asm ("a") = 2;
int b asm ("b") = 3;
int c asm ("c")= 0;
int REG_eax asm ("REG_eax")= 0;
int REG_edx asm ("REG_edx")= 0;
int REG_ecx asm ("REG_ecx")= 0;
int main()
{
	asm("mov $1, %rax");
	asm("cpuid");
	asm("mov %edx, REG_edx"); 
	asm("mov %ecx, REG_ecx"); 
	if(REG_edx && 0x800000) printf("MMX ");
	if(REG_edx && 0x2000000) printf("SSE ");
	if(REG_edx && 0x4000000) printf("SSE2 ");
	if(REG_ecx && 0x00000001) printf("SSE3 ");
	if(REG_ecx && 0x00000200) printf("SSSE3 ");
	if(REG_ecx && 0x00080000) printf("SSE4.1 ");
	if(REG_ecx && 0x00100000) printf("SSE4.2 ");
	if(REG_ecx && 0x00200000) printf("AESNI ");
	if(REG_ecx && 0x00000002) printf("PCLMULQDQ ");

	printf("\n");
	printf("REG_edx = %x\n", REG_edx);
	printf("REG_ecx = %x\n", REG_ecx);

	asm("mov a, %rax");
	asm("add b, %rax");
	asm("add $100, %rax");
	asm("mov %rax, c");
	printf("%d\n", c);
	return 0;
}

$ gcc -o inline_asm inline_asm.c

MMX SSE SSE2 SSE3 SSSE3 SSE4.1 SSE4.2 AESNI PCLMULQDQ
REG_edx = f8bf3ff
REG_ecx = 82982203
105

このような結果になりました。

コメント(0)続きを読む

64ビットでアセンブラをやってみる

以前アセンブラの記事を書いたのがどちらも32ビットでした。

先日64ビットのLinux環境でアセンブラを行ったら全く違う動作になったのでメモします。

<asm_test.c>

#include  <stdio.h>

extern int _add(int a, int b);
extern int _sub(int a, int b);
extern int _mul(int a, int b);
extern int _div(int a, int b);
extern float _fadd(float a, float b);
extern float _fsub(float a, float b);
extern float _fmul(float a, float b);
extern float _fdiv(float a, float b);

int main () {
	printf("_add 4 + 9 = %d\n", _add(4,9));
	printf("_sub 18 - 7 = %d\n", _sub(18,7));
	printf("_mul 8 * 6 = %d\n", _mul(8,6));
	printf("_div 27 / 8 = %d\n", _div(27,8));

	printf("_fadd %f\n", _fadd(4.15, 6.26));
	printf("_fsub %f\n", _fsub(8.56, 4.87));
	printf("_fmul %f\n", _fmul(2.5, 3.76));
	printf("_fdiv %f\n", _fdiv(15.98, 3.64));
    return 0;
}

<asm_test.s>

	bits 64
	global _add
	global _sub
	global _mul
	global _div
	global _fadd
	global _fsub
	global _fmul
	global _fdiv

    ;; start program area
    section .text

    ;; global functions

_add:
 ; rdi(引数1)をrax(戻り値)に格納
	mov    rax, rdi
 ; rsi(引数2)をraxに加算
	add    rax, rsi
    RET

_sub:
	mov    rax, rdi
	sub    rax, rsi
    RET

_mul:
	mov    rax, rdi
	imul    rax, rsi
    RET

_div:
	mov    rax, rdi
	mov    rbx, rsi
 ; 符号拡張した値をedxに格納
	cdq
	idiv    rbx
    RET

_fadd:
 ;xmm1をxmm0に加算し、xmm0に格納
	addss xmm0, xmm1
	ret

_fsub:
	subss xmm0, xmm1
	ret

_fmul:
	mulss xmm0, xmm1
	ret

_fdiv:
	divss xmm0, xmm1
	ret

上記2つのファイルを以下の方法でリンクします。


$ gcc -o asm_test.o -c asm_test.c
$ nasm -f elf64 -o asm_s.o asm_test.s
$ gcc -o asm_test asm_test.o asm_s.o

実行結果

_add 4 + 9 = 13
_sub 18 - 7 = 11
_mul 8 * 6 = 48
_div 27 / 8 = 3
_fadd 10.410000
_fsub 3.690001
_fmul 9.400000
_fdiv 4.390110

ただこのやり方が合ってるのかは不明ですが・・・

コメント(0)続きを読む

Google V8 Engineを試す

環境はUbuntu12.04

V8のビルドにはSCONSが必要とかかれていますが、今後SCONSはサポートされなくなるようなのでmakeを使います。

$ svn co http://v8.googlecode.com/svn/trunk/ v8
$ make dependencies
$ make ia32

ビルドは完了しました。サンプルを動かしてみます。まずはshellを作成します。

g++ -o shell -m32 -O2 -m32 obj/sample/shell/release/shell.o -L. -lv8 -lpthread

<test.js>

print("test");

実行する。
$ ./shell test.js
もう一つのサンプルを動かしてみます。
$ g++ -o process -m32 -O2 -m32 obj/sample/process/release/process.o -L. -lv8 -lpthread
$ ./process samples/count-hosts.js verbose=true

Logged: Processing google.com/process.cc from localhost@firefox
Logged: Processing google.net/ from localhost@firefox
Logged: Processing google.org/ from localhost@safari
Logged: Processing yahoo.com/ from localhost@ie
Logged: Processing yahoo.com/ from localhost@safari
Logged: Processing yahoo.com/ from localhost@firefox
google.com: 1
google.net: 1
google.org: 1
yahoo.com: 3

結果が何のかはよく分かっていないんですが・・・
自前のC++ソースに組み込む場合も説明します。

https://developers.google.com/v8/get_started#hello

Hello Worldの2個目のサンプルを使用します。上記ページではx64でビルド指定してますが、ia32でコンパイルします。
$ g++ -Iinclude hello_world.cc -o hello_world out/ia32.release/obj.target/tools/gyp/libv8_{base,snapshot}.a -lpthread
$ ./hello_world
で実行します。

参考ページ

Google Chrome の JavaScript エンジン V8 を試す – IT戦記

Building V8

コメント(0)続きを読む

Windowsでもアセンブラ

環境はWindows7 + Cygwinを使いました。

gccは3.4.4、nasmは2.08.02が入っています。

<asmtest.s>

    global      _main
    extern      _printf

    section .text
_main:
    push        message
    call        _printf
    add         esp, 4
    ret
message:
    db  'AsmTest.', 10, 0

$ nasm -f win32 asmtest.s

$ gcc -o asmtest asmtest.obj

$ ./asmtest

AsmTest.

この状態では45,314バイトのexeファイルが生成されました。-sコマンドで同時にstripを行います。

$ gcc -o asmtest -s asmtest.obj

ファイルサイズは4096バイトに減らせました。

コメント(0)続きを読む