指定したファイルをAll Usersデスクトップに移動するスクリプト書いた

指定したファイルをAll Usersデスクトップに移動するスクリプト書いた。OSのバージョンが6.0より低かったら"C:/Documents and Settings/All Users/デスクトップ/"に、6.0以上だったら"C:/Users/Public/Desktop/"に移動する。あんまり使い道ないと思うけど…

var args = WScript.Arguments;
var fs = WScript.CreateObject("Scripting.FileSystemObject");
var wbem = WScript.CreateObject("WbemScripting.SWbemLocator");
var wmi = wbem.ConnectServer();
var os = wmi.ExecQuery("Select * From Win32_OperatingSystem");
var e = new Enumerator(os);
for(; !e.atEnd(); e.moveNext()){
  var item = e.item();
  var os_version = item.Version.slice(0,3);
  if(os_version < 6.0){
    for(i = 0; i < args.length; i = i + 1){
      fs.MoveFile(args(i), "C:/Documents and Settings/All Users/デスクトップ/");
    }
  }else{
    for(i = 0; i < args.length; i = i + 1){
      fs.MoveFile(args(i), "C:/Users/Public/Desktop/");
    }
  }
}

こんな感じで使う。

>cscript //nologo Move_to_All_Users_Desktop.js recipes.txt equipments.txt

XPとかだとドラッグアンドドロップでも動くけど、Vista以降だとコマンドプロンプトを管理者権限で開いて実行しないと無理っぽい。

TeratermとWinSCPとサクラエディタをサイレントインストールする

TeratermWinSCPサクラエディタはInno Setupを使って作られてることが分かったので、サイレントインストールしてみる。まずはこんな感じで、infファイル(セットアップ情報ファイル)を保存しながらのインストール開始を指示する。

>winscp514setup /SAVEINF="winscp514.inf"

インストールが始まったら、あとはふつうにインストールしていく。

インストールが完了すると、infファイル(セットアップ情報ファイル)ができてる。中身はこんな感じ。

[Setup]
Lang=jp
Dir=C:\Program Files (x86)\WinSCP
Group=WinSCP
NoIcons=0
SetupType=full
Components=main,shellext,pageant,puttygen,transl,transl\eng,transl\jp
Tasks=enableupdates,enableupdates\enablecollectusage,desktopicon,desktopicon\common,sendtohook,urlhandler

Teratermサクラエディタも同じように作る。できた中身はこんな感じ。

[Setup]
Lang=ja
Dir=C:\Program Files (x86)\teraterm
Group=Tera Term
NoIcons=0
SetupType=custom
Components=teraterm,ttssh,cygterm,logmett,ttproxy,additional_plugins,additional_plugins\ttxresizemenu,additional_plugins\ttxttyrec
Tasks=desktopicon,quicklaunchicon
[Setup]
Lang=ja
Dir=C:\Program Files (x86)\sakura
Group=サクラエディタ
NoIcons=0
SetupType=all
Components=main,help,keyword
Tasks=startmenu,quicklaunch,proglist,fileassoc

infファイルができたら、今度はそのinfファイルを読み込ませてサイレントインストールしてみる。3ついっぺんに、かつ、時間を計測したかったのでcygwinbashスクリプトでやってみた。作ったスクリプトはこんな感じ。/SILENTが「黙ってやれ」、/LOADINFが「このinfファイルを読んでやれ」、/SP-が「StartupPromptを表示しない(ホントに初めていいですか?とか聞くな)」とゆーよーな指示みたい。

time ./teraterm-4.77 /SILENT /LOADINF="teraterm-4.77.inf"
time ./winscp514setup /SILENT /LOADINF="winscp514.inf"
time ./sinst2-0-5-0 /SP- /SILENT /LOADINF="sakura2-0-5-0.inf"

実行してみる。

$ bash ./all.sh

real    0m1.733s
user    0m0.000s
sys     0m0.015s

real    0m3.396s
user    0m0.015s
sys     0m0.015s

real    0m0.881s
user    0m0.000s
sys     0m0.015s

合計でだいたい6秒くらいでインストール完了した。

参考にしたページ→ Inno Setup Help

論理プロセッサの数に応じて処理を行う

ウチのパソコンは論理プロセッサを4つ積んでる。

論理プロセッサの数に応じて処理を行うスクリプト書いた。

$numberOfLogicalProcessors =
(Get-WmiObject -query "SELECT * FROM Win32_Processor").NumberOfLogicalProcessors
for($i = 2; $i -le $numberOfLogicalProcessors; $i++){
  echo("kani" + $i)
}

こんな感じで使う。

> .\for.ps1
kani2
kani3
kani4

BCL easyPDF SDKていうのをC++から使ってみた

わりと簡単な感じだった。Visual C++ 2010 Expressでふつうにビルドできた。C++よく分かんないので、ファイル名を可変にする方法が分からない…

#include "stdafx.h"
#import "progid:easyPDF.Printer.7"
static const TCHAR* MyProgID = _T("easyPDF.Printer.7");
int _tmain(int argc, char* argv[]){
  TCHAR lpInFileName[] = _T("C:\\Users\\hide\\Pictures\\aaa.jpg");
  TCHAR lpOutFileName[] = _T("C:\\Users\\hide\\Documents\\aaa.pdf");
  HRESULT hr = CoInitialize(NULL);
  {
    EasyPDFPrinter::IPrinterPtr pPrinter = NULL;
    EasyPDFPrinter::IPrintJobPtr pPrintJob = NULL;
    hr = pPrinter.CreateInstance(MyProgID);
    pPrintJob = pPrinter->GetPrintJob();
    pPrintJob->PrintOut(lpInFileName, lpOutFileName);
  }
  CoUninitialize();
  return 0;
}

ファイルディスクリプタの上限を超えたらTomcatがどうなるか調べてみた

ファイルディスクリプタの上限を超えたらTomcatがどうなるか調べてみた。とりあえずyumコマンドでインストール。

# yum install tomcat5 tomcat5-webapps tomcat5-admin-webapps

こんな感じで、必ず10秒かかっちゃうページを用意した。

<%@ page contentType="text/html;charset=UTF-8" autoFlush="true" %>
<html>
<head>
<title>10</title>
</head>
<body>
<%
for(int i=0;i<=10;i++){
  Thread.sleep(1000);
  out.print("…");
  out.flush();
}
%>
</body>
</html>

Apache Benchで負荷をかける。(同時接続数205)

C:\Program Files (x86)\Apache Software Foundation\Apache2.2\bin>ab -c 205 -n 205 http://192.168.159.128:8080/out.jsp

catalina.outにこんな感じのメッセージが出た。

SEVERE: All threads (150) are currently busy, waiting. Increase maxThreads (150) or check the servlet status

server.xmlのmaxThreadsを150から1500に上げたら出なくなった。

# diff -u server.xml_old server.xml
--- server.xml_old      2012-09-20 04:54:41.000000000 -0700
+++ server.xml  2012-09-20 05:00:10.000000000 -0700
@@ -75,7 +75,7 @@

     <!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
     <Connector port="8080" maxHttpHeaderSize="8192"
-               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
+               maxThreads="1500" minSpareThreads="25" maxSpareThreads="75"
                enableLookups="false" redirectPort="8443" acceptCount="100"
                connectionTimeout="20000" disableUploadTimeout="true" />

負荷を上げてみる。上限を1500まで上げたので、リクエストを1280件同時に上げる。

C:\Program Files (x86)\Apache Software Foundation\Apache2.2\bin>ab -c 1280 -n 1280 http://192.168.159.128:8080/out.jsp
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.159.128 (be patient)
apr_socket_recv: 既存の接続はリモート ホストに強制的に切断されました。   (730054)

こんどは強制的に切断されるようになった。
catalina.outにはこういうメッセージがバンバン出た。

SEVERE: Endpoint ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=8080] ignored exception: java.net.SocketException: Too many open files

ファイルディスクリプタの上限に引っかかってるっぽい。なので、起動スクリプト/etc/init.d/tomcat5を修正してみる。
こんな感じでulimitコマンドを追加したら出なくなった。

# diff -u tomcat5_old tomcat5
--- tomcat5_old 2012-09-20 05:41:00.000000000 -0700
+++ tomcat5     2012-09-20 05:42:45.000000000 -0700
@@ -176,6 +176,7 @@

 # See how we were called.
 function start() {
+    ulimit -n 4096
     echo -n "Starting ${TOMCAT_PROG}: "
     if [ -f "/var/lock/subsys/${NAME}" ] ; then
         if [ -f "/var/run/${NAME}.pid" ]; then

まとめ

Linuxの場合ユーザーごとのファイルディスクリプタの上限のデフォルトは1024みたい。なので、それを超えるリクエストをいっぺんに受けたいときは、ulimitで上限を上げてやる必要がある。

プロセスごとのCPU使用率をログに取るには

プロセスごとのCPU使用率はtopコマンドで画面に表示できる。だけど、topコマンドは端末の画面の大きさに合わせて自動的に結果をカットしてくれる(レコードが固定長になる)ので、ログを取るのには向いていない。
きれいにログを取るには、psコマンドを使う。

while true;
  do ps auxww --sort=-pcpu | sed -e "s/^/`date +%T` /" >> hoge.log;
  sleep 60;
done;

こんな感じで取れる。

06:41:29 USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
06:41:29 root      4255  0.1  1.9  26872 20332 tty7     Ss+  05:52   0:04 /usr/bin/Xorg :0 -br -audit 0 -auth /var/gdm/:0.Xauth -nolisten tcp vt7
06:41:29 root      3761  0.1  0.3  10348  3112 ?        Ss   05:52   0:03 cupsd
06:41:29 68        3991  0.0  0.4   6412  4496 ?        Ss   05:52   0:01 hald
06:41:29 hide      5213  0.0  1.5  63916 15740 ?        Sl   05:55   0:01 gnome-terminal
06:41:29 root      4075  0.0  0.0   1968   672 ?        S    05:52   0:01 hald-addon-storage: polling /dev/hda