JavaScriptの小技集とかって記事を参考になるなって見てる人とは仕事したくない。

久しぶりの日記

あれ、いつも書いてるな~というJavaScript の小技集 | バシャログ。

配列からランダムで値を取り出す

Math.floorが抜けてるからnullが返って来る

等差数列の配列を作る

すごく見にくい。普通にforループでええやん

A-Zのアルファベットと英数字からランダムな文字列を取得する

そうかくならwhile(len--)のほうがスマートなのでは?!!?

配列をシャッフルする

すっごく偏る http://ideone.com/uB1GJk

もう疲れた。この記事に載ってる処理のほとんどがunderscore.jsで関数1個とかに置き換えられるのでお勧めです。

Wikipediaのリンク最短経路を探索するウェブアプリを公開しました。

http://wikipetan.kfka.net/

こんな感じ

なんかGWの4日くらい消費して、半年近くフロントエンドエンジニアしてたせいでプログラミング能力が恐ろしく落ちているのを実感しました。

アルゴリズムとか詳細

計算機触った人ならだれもが尊敬するダイクストラ様のアルゴリズムを借用しています。 Celeron G530の1コアで1クエリあたり500msで処理出来ます。 始点が一緒なら終点が違う経路探索は計算結果を使いまわせるのですが、ダイクストラ法の計算結果が1MB近くのサイズになり、それをキャッシュして管理するのが面倒なのでしていません。代わりに、分散処理が容易になるようにRedisのRPUSH/BLPOPとPub/Sub(後述)を使っています。

Redis RPUSH/BLPOPとPub/Sub

  • WebAppはリクエストを受け取った時点でPub/Subでサブスクリプションして、メッセージを待つ。
  • WebAppはリクエストをRPUSHでジョブキューを追加して、ワーカーはBLPOPでジョブを受け取る。
  • ワーカーは受け取ったジョブをこなしてPub/Subのパブリッシュでメッセージを送信。
  • WebAppはPub/Subのメッセージを受信しレスポンスを返す。

といった感じで処理しています。正確には最終的な結果をキャッシュしているのでもう少し複雑ですが。

Debian SqueezeにRedis 2.6をインストール

ほとんど公式ドキュメントのまま。 ビルドするのにbuild-essential、テストにtclが必要なので最初にインストールしてる。 redis-2.6.xx.tar.gzの部分は公式ドキュメントから安定版の最新を各自取得してください。

$ sudo apt-get install -y build-essential tcl
$ wget http://redis.googlecode.com/files/redis-2.6.xx.tar.gz
$ tar xzf redis-2.6.13.tar.gz
$ cd redis-2.6.13
$ make
$ make test
\o/ All tests passed without errors!
$ sudo make install

mysqlとmongodbサーバー構築メモ

自宅サーバーにmongodbとmysqlをインストールしたのでメモ。同じディスクでmongodbもmysql も使いたい!という奇特な人向け。

DBディスクはLVMを使う

mysqlでinnodbを使っていて、なおかつmongodbでジャーナルをオンにしている場合、バックアップはLVM Snapshot一発でイケるから楽でよい。確認していないけどredisもジャーナルをオンにしたら同じようにSnapshotだけでバックアップできると思う。

DBディスクはマウントオプションにnoatimeをつける

atime(最終アクセス日時)はmtime(更新日時)あるからいらない子だよねーという話。 MongoDB イン・アクションの10章に書いてあった。 もちろんnoctimeとかnomtimeとかして死んでも知りません。

ファイルシステムはext4を使う マウントオプションにnobarrierをつける

mongodbをext3で使うとpreallocateで死にます。また、mysqlをext4やxfsで使うとI/Oバリアで3倍遅くなります。なのでext4でI/Oバリアを無効にして使うようにします。

ファイルディスクリプタを増やす

デフォルトだと1プロセルのファイルディスクリプタの上限は1024とかそこら辺らしいので10倍くらいにする。limits.confで編集する。これもmongodb イン・アクションに書いてあった。

MongoDBイン・アクション

MongoDBイン・アクション

LVMで2TiB以上のドライブを追加

4月1日から神奈川ケーブルテレビがTOKYO MXのパススルーを始めたらしく、ハイビジョンスパイラルが本格化したので、TS置き場に後から容易にディスクを追加できるLVMを導入した。 高収入を得られたら、こんなかんじのハードウェア構成でZFSなNAS導入する予定なので、今回は冗長化も何も無いその場しのぎ構成。 環境はDebain squeezeで追加するディスクはWD Red 3TB 1本。/dev/sdbとして認識されている。

1.LVMパーティションを作る

2TiB以上のパーティションをfdiskは作れないのでpartedコマンドを用いる。 同じ理由でMBRからGPTにしてる。

# apt-get install parted -y
# parted /dev/sdb
GNU Parted 2.3
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.

(parted) mklabel gpt
Warning: The existing disk label on /dev/sdb will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? yes

(parted) mkpart primary 0 -0 #0 -0で最大容量指定
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? Ignore #単位書いて無いけとまちがっていないか?という旨の警告らしい

(parted) set 1 lvm on

(parted) print
Model: ATA WDC WD30EFRX-68A (scsi)
Disk /dev/sdb: 3001GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt

Number  Start   End     Size    File system  Name     Flags
 1      17.4kB  3001GB  3001GB               primary  lvm

(parted) quit
Information: You may need to update /etc/fstab.

2.PVを作る

LVMのPhysical Volumeを作成する。lvm関連のコマンドが入ってなかったので最初にインストールしてる。

# apt-get install lvm2 -y 
# pvcreate /dev/sdb1
  Physical volume "/dev/sdb1" successfully created
# pvdisplay /dev/sdb1
  "/dev/sdb1" is a new physical volume of "2.73 TiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb1
  VG Name
  PV Size               2.73 TiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               **********************

3.VGを作る

Volume Groupを作成する。PEサイズはなんとなく16Mにしてみた。

# vgcreate -s 16m tateya /dev/sdb1
  Volume group "tateya" successfully created
# vgdisplay tateya
  --- Volume group ---
  VG Name               tateya
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               2.73 TiB
  PE Size               16.00 MiB
  Total PE              178849
  Alloc PE / Size       0 / 0
  Free  PE / Size       178849 / 2.73 TiB
  VG UUID               *****************

4.LVを作る

Logical Volumeを作成する。

# lvcreate -n tateya -l 100%FREE tateya #-l 100%FREEで最大容量になる
  Logical volume "tateya" created
# lvdisplay
  --- Logical volume ---
  LV Name                /dev/tateya/tateya
  VG Name                tateya
  LV UUID                ***************************
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                2.73 TiB
  Current LE             178849
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:0

5.ファイルシステムを作ってマウント

最後にファイルシステムを作ってマウントする。ファイルシステムはext4でマウントポイントは/

# mkfs.ext4 /dev/tateya/tateya
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=1 blocks, Stripe width=0 blocks
183148544 inodes, 732565504 blocks
36628275 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
22357 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
    4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
    102400000, 214990848, 512000000, 550731776, 644972544

Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 28 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

# mkdir /mnt/tateya
# mount /dev/tateya/tateya /mnt/tateya/
# df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/sda1             222G  683M  210G   1% /
tmpfs                 2.0G     0  2.0G   0% /lib/init/rw
udev                  2.0G  128K  2.0G   1% /dev
tmpfs                 2.0G     0  2.0G   0% /dev/shm
/dev/mapper/tateya-tateya
                      2.7T  201M  2.6T   1% /mnt/tateya

あとは/etc/fstab編集する。 blkid /dev/tateya/tateyaでfstabに追加すべきUUIDが調べられる。

RTX1100にSSH接続するとき便利なコマンドcocot

RTX1100にSSH接続すると、ありがたいことに日本語で喋ってくれる。 しかし文字エンコードがSJISであり、シェルはUTF8なので当然日本語でおk状態になる。 こういう時cocotコマンドが便利。Macならportとかでインストールできる。

cocot -t UTF-8 -p SJIS ssh 192.168.0.1 -ladmin

-tに出力(シェル)側の文字エンコード、-pにサーバー側の文字エンコードを指定する

ML110 g7がSSDを認識しないときの対処法

GWなのでML110 G7いじってたら、SSDを認識しない。 Intel SSD 520 240GBを挿してると、起動時プログレスバーの最後のほうでフリーズしてしまう。

これは、SATAがIDEモードになってるのが原因らしいので、一旦SSDを抜いて、起動時F9を押しBIOSを起動。 Advance Options→SATA Contoroller Options→Embedded SATA ConfigurationをEnable SATA Legacy SupportからEnable SATA AHCI Supportに変更。警告出るけどRAID有効にしたらデータ消し飛ぶとの事なので気にしない。ESC→F10で保存して再起動。 再起動後も一回電源落としてSSD挿して起動したらキチンと認識しました。

おまけ

http://www.intel.co.jp/content/www/jp/ja/solid-state-drives/solid-state-drives-dc-s3700-series.html

f:id:YarmUI:20130428231049p:plain

一貫してすごい

Intel SSD 520 Series(Cherryville) 240GB 2.5inch Bulk SSDSC2CW240A310

Intel SSD 520 Series(Cherryville) 240GB 2.5inch Bulk SSDSC2CW240A310