2009年10月21日

世界のエンジニア 〜TopCoder〜

今日はたまたまお休みが取れたので、
TopCoderのアルゴリズムコンテストに参加しました。

このところずっと急激な右肩下がりでランクが落ちているので、
この辺で頑張らねば・・・

さて、今日の問題はこんな感じでした。。。
TopCoder

※アカウントをもっていない方のために、
 DIVTの250点問題の概要を載せます。
 (他にも500点、1000点問題やDIVUの問題アリ)

ルール@
 まず2つの数字が与えられます。
 1つ目が、元になる数字。2つ目が基準値。
ルールA
 返却値は、基準値以上の数字で、
 元になる数字にあるルールに従った数字を足したもの。
  例1)与えられる数字が、12341000000 の場合
        1234
   + 12340
   + 123400
   + 1234000
   ---------
    1370974 ← 答え


  例2)与えられる数字が、11100 の場合
      11
   + 110
   -----
    121 ← 答え


  例3)与えられる数字が、2010 の場合
      20 ← 答え


ルールはお分かりでしょうか。。。


さて、私がこのコンテストのコーディング時間中に作成したのが、
これです:

public class ReverseMagicalSource {
public int find(int source, int A) {
int ans = 0;
if(source > A) {
return source;
} else {
ans = source;
for(int i = 1; ans <= A; i++) {
ans = ans + (int) (source * Math.pow(10, i));
}
}
return ans;
}

public static void main(String[] args) {
ReverseMagicalSource temp = new ReverseMagicalSource();
int[][] num = {
{19, 200},
{19, 18},
{333, 36963},
{1234, 1000000}
};

for(int[] i : num) {
int source = i[0];
int A = i[1];
System.out.println(temp.find(source, A));
}
}
}


※ find()の部分が今回求められていた実装箇所です。


しかし、challengeフェーズで他のソースを見ていた時に、
思わず衝撃と感動を覚えた実装方法が。。。


と、正解を出す前に、
皆さんならどういう実装をされますか?


続き...
posted by ぃぬっくす at 13:48| 千葉 晴れ| Comment(0) | TrackBack(0) | プログラム | このブログの読者になる | 更新情報をチェックする

2009年10月16日

実現したいこと、実現してること

数年前、とある天才ハッカーがパソコンや携帯からいろいろな方法を使って
悪徳企業などにハッキングして、懲らしめるというテレビアニメをやっていた。

これを見たときから、
『ユビキタスなリモートアクセス環境がほしい』
『自サーバを構築したい』
『携帯からでもCUI操作がしたい』
などの希望がある。

そう夢見ていた時、つい先日思わぬところからヒントが出てきました。


Pink0


仕事つながりで知り合ったある方が以前作られたとか。
私が想像していたものとは違うものの、概ねその通りといいますか、
かなり重要なヒントが得られたように感じました。


あとは、リモートアクセスによる操作に対して、
いろいろと考えるべき点はまだまだあります。
以下はザッと考えてみた内容です。

・どのようなサーバを構築し、公開するか。
・リモートアクセスによる権限で、どこまで操作を許容するか。
・認証方法や通信の暗号(ssh)をどうするか。
・「踏み台」的な利用を含む、不正アクセスに対する対処をどうするか。
・プロセスの死活監視をどうするか。

などなど…


課題は沢山ありますが、要件整理から始めようと思いますww
posted by ぃぬっくす at 08:42| 千葉 晴れ| Comment(0) | TrackBack(0) | 思いつきイロイロ | このブログの読者になる | 更新情報をチェックする

2009年10月15日

グリッドコンピューティング

Grid Computing(グリッド コンピューティング)という技術をご存知でしょうか。


(知らない方のために、)簡単に説明しますと、
世界中に無数に存在するコンピューターには使われていないリソースが沢山あります。
※リソース=主にCPU。他にはメモリやHDDなど

その使われていないリソースに少しずつ処理を分割して引き渡し
最終的に膨大な演算処理を短時間で行えるようにしようというものです。


さて、本題に戻りますが、
このグリッドコンピューティング技術を実現させるためには、
各コンピューターに処理を分割させる『サーバ役』と、
割り当てられる処理を待ち受ける『クライアント役』が必要です。

環境さえ整ってしまえば、
世界最速を誇るスーパーコンピューターにすら負けないような
処理能力が得られる可能性があります。

ただ、私のような一般人にはそんな技術や知識がなければ、環境も限りなくないです。


でもここで諦める事なかれ!!

手軽にグリッドコンピューティングを体験する方法の一つに、

Grid Gain

というオープンソースを見つけました。

これはJavaベースで作られており、Eclipse上での実行が可能です。

まだまだ日本語の紹介サイトは少ないですが、
本家のサイト(英語)にはデモンストレーションムービーとして、
インストールやサンプルの実装方法が紹介されています。

機会があればこのblogでも紹介したいと思います。
posted by ぃぬっくす at 22:12| 千葉 晴れ| Comment(0) | TrackBack(0) | 思いつきイロイロ | このブログの読者になる | 更新情報をチェックする

2008年12月01日

sudoコマンド

コマンドを実行させる際、
どうしても特定のユーザで実行させたい場合があるとする。
rootユーザになって、ユーザAになって実行、またrootユーザに戻って・・・

そんなことを繰り返していると、
手間がかかって効率が悪い。

そこで、使えるコマンドが 『sodo』 である。
これは、rootユーザがコマンドで指定したユーザに成り代わって
処理を実行させることができるものです。
$ su
password :
# sudo -u guest /home/guest/testShell.sh
          (guestユーザとしてtestShell.shを実行させる。) 

たったこれだけ。
sudoコマンドを使わずに同じことをやろうとすると、
  root ⇒ su guest ⇒ シェルの実行 ⇒ exit ⇒ root
と、手順が多くなってしまいますよね。。。

いやぁ〜、Linux(Unix)は知れば知るほど奥が深いです!!
posted by ぃぬっくす at 19:23| 千葉 曇り| Comment(0) | Linux | このブログの読者になる | 更新情報をチェックする

2008年11月11日

素数判定アルゴリズム

素数ってご存知ですよね?

知らない方のために、
簡単に説明しますと・・・
「素数とは、1とその数でしか割ることができない数を指し、
 それ以外の数字(0は除く)を合成数と呼ぶ。」

分かりました?? ⇒ 分からなかった方はコチラ


さて、
今回の主題はRubyで素数配列を
エラトステネスのふるい』の理論を使って見つけようと思います。
現在web上には既にいろいろな素数判定のアルゴリズムがありますが、
今回私が作るアルゴリズムはあくまで私が考え出したものです。
もしかしたらもっと効率のいい方法があるかもしれませんし、
既にある方法と全く同じかもしれませんが、
その辺はあらかじめご了承ください。

ところで、
まだまだRubyの実行環境がお持ちのPCにない方が多いと思うので、
こんなサイトをついでに紹介します。

 「codepad

ここは、RubyやCをはじめ、
さまざまな言語が実行できる環境として提供されています。
引数の指定ができないなど、
制約はありますが、
基本的な部分であれば
問題ないかと思います。
入門用としてはじゅうぶんではないでしょうか。

これから紹介するアルゴリズムを実行させる環境として、
また、個々の学習のために
使われてはいかがでしょうか。


では、本題に入ります。
以下がRubyで書いたソースになります。
ちなみにcodepad では実行時間に制約があるらしく
ある一定の時間が経つと "Timeout" となるので、
判定できる数の最大は317までです。
#! ruby -Ku
# 素数配列抽出アルゴリズム
class Test
    # 配列インスタンスの生成と初期値の設定
    array = Array[2]
    # 求める素数の上限を設定
    max = 100
   
    print("処理開始\n\n")
   
    # 各数字(num)が素数か判定するループ
    for num in 3..max do
        print("num = ", num, "  ")
       
        # 素数配列から1つずつ素数(prime)を取得し、処理するループ
        for prime in array do
            # チェック1
            # 0または1は素数ではないため、次の数字(num)に移る
            if (num==0 || num==1) then
                break
            # チェック2
            # 与えられた数字(num)が取得した素数(prime)で割れた場合、
            # その数字は素数ではないため、次の数字(num)に移る
            elsif (num%prime==0) then
                break
            end
           
            # 素数配列全てを確認し終わってもチェックに引っ掛からなければ、
            # その数字は素数であるため、素数配列に追加
            if prime>=Math::sqrt(num) then
                array[array.size] = num
                print("★追加")
                break
            end
        end
        print("\n配列のsize = ", array.size, "\n")
        print("配列 = ");p array
        print("\n")
    end
    print("break\n")
    print("配列のsize = ", array.size, "\n")
    print("配列 = ");p array
   
    print("処理終了\n")
end

※ 1行目の文字コード指定を忘れると、実行した時に色々と弊害が出てくるので注意!
Windows上で動かす場合 : #! ruby -Ks
codepad 上で動かす場合 : #! ruby -Ku


おまけに、
Java用のコードにも作り変えてみたので、
合わせて載せておきます。
import java.util.ArrayList;
/**
 * 素数配列抽出アルゴリズム
 * 作成日:2008/11/09
 * @author hosokawa
 */
public class prime {
    /**
     * @param args 求める素数の数
     */
    public static void main(String[] args) {
        // 配列インスタンスの生成
        ArrayList array = new ArrayList();
        // 配列に 2 を追加
        array.add(new Integer(2));
        // 素数配列の上限を設定
        int max = 10;
       
        System.out.println("処理開始\n");
       
        // 各数字(num)が素数か判定するループ
        for(int num=3; num<=max; num++){
            // 素数配列のサイズ(この時点での配列に含まれる素数の数)
            int i = array.size();
            System.out.print("num = " + num + "  ");
           
            // 素数配列に含まれる各素数で与えられた数字(num)を判定
            for(int n=0; n                // 素数配列の数字を取得
                Integer prime_ = (Integer) array.get(n);
                int prime = prime_.intValue();
               
                // チェック1
                // 0または1は素数ではないため、次の数字に移る
                if (num==0 || num==1){
                    break;
                // チェック2
                // 与えられた数字(num)が取得した素数(prime)で割れた場合、
                // その数字は素数ではないため、次の数字に移る
                } else if (num%prime==0) {
                    break;
                }
               
                // 素数配列全てを確認し終わってもチェックに引っ掛からなければ、
                // その数字は素数であるため、素数配列に追加
                if (prime>=Math.sqrt(num)){
                    array.add(array.size(), new Integer(num));
                    i += 1;
                    System.out.print("★追加");
                    break;
                }
            }
            System.out.println("\n配列のsize = " + array.size());
            System.out.println("配列 = " + array + "\n");
        }
        System.out.println("break");
        System.out.println("配列のsize = " + array.size());
        System.out.println("配列 = " + array);
       
        System.out.println("処理終了");
    }
}

いかがでしょうか?
posted by ぃぬっくす at 17:00| 東京 曇り| Comment(0) | プログラム | このブログの読者になる | 更新情報をチェックする

2008年11月09日

FTP設定

時々LinuxサーバにFFFTPというftpツールを使ってファイルをアップする機会があります。
(このツールを使われたことがある方も多いかと思いますが。)

しかし、ある時ファイルをアップしようにもどうしてもバイナリ形式になってしまい、
ASCIIモードでアップされませんでした。
知識の乏しい私は、
知識のある知り合いに相談しました。

調べてみると、
ftp関連を管理するプロセス『vsftpd』に原因があるとのこと。
その設定ファイルである『vsftpd.conf』を見てみると、
デフォルト設定のままになっている項目を発見。

# ascii_upload_enable=YES  → アップロード時にASCIIで転送不可
# ascii_download_enable=YES → ダウンロード時にASCIIで転送不可
そこで、頭についている "#" をのけて、
設定を有効化する。
ただし、その方曰く、
vfstpd は通常ftp接続が行われた際に、
xinetdプロセスにより起動され初期化されるため、
OS起動時からは起動していないとか。
ということで、xinetdプロセスを再起動させる。
[root@linux ~] # /etc/init.d/xinetd restart
しかし、変更した設定が反映されない。
xinetd.d配下のvsftpのconfファイルを確認すると、
以下の設定があった。
disable = yes
これは、xinetd 経由で vsftp を起動させない設定らしいです。
そのため、vsftpd プロセスを直接再起動する。
[root@linux ~] # /etc/init.d/vsftpd restart
無事FTPでASCIIモード転送が行えるようになりました。


ちなみに、今回のこの作業中に
新たに知った「grep」のコマンドオプションがあるので、
ついでに紹介します。
ただ、知っている方がほとんどだとは思いますが… 
[root@linux ~] # cat a.txt
aaaaa
aaaab
aaaba
aaabb
…(省略)…
bbbba
bbbbb
[root@linux ~] # cat a.txt | grep aaaa
aaaaa
aaaab
baaaa
[root@linux ~] # grep -v 'a' a.txt
bbbbb
[root@linux ~] #
grep って奥が深く、便利なコマンドですよね♪
 ← 引数のファイルを
    パイプでつないだgrepによって
    フィルタをかけ、表示。

 ← 引数のファイルで、
    aを含まない行のみを表示。
posted by ぃぬっくす at 14:44| 東京 曇り| Comment(0) | Linux | このブログの読者になる | 更新情報をチェックする

2008年09月16日

縁の下の力持ち『.netrc』

Linuxの知識がまだまだ乏しく、
日々の仕事でいろいろと新しいことを学習しています。

さて、Linuxで別の端末にftp接続する時、
通常は以下のように接続します。


$ ftp example01 (IPアドレスでも可)
password :
ftp > 

しかし、「.netrc という以下のような内容のファイルを
ユーザのホームディレクトリに作成すると
ログイン処理が自動化できます。
※一応説明:ユーザのホームディレクトリはログイン時に表示されるディレクトリ
        root ユーザなら /root/ 、その他のユーザなら /home/"ユーザ名"/ です。



machine example01 (ftp サーバの名前を記入します)
login root (サーバのアカウント名を記入します)
password root (パスワードを記載します)
macdef init
 (初期マクロを記載します)
macdef test_macro (マクロ名は何でもOK)
 (マクロを記載します)


接続先やログインアカウント名、パスワードなどを直に書き込むため、
他のユーザ見られないようにパーミッションを変更しておきます。

(guest ユーザの設定ファイルを作成した場合)
$ cd /home/guest/
$ chmod 600 .netrc


macdef init には ftp 接続成功時に自動的に実行される処理を書きます。
macdef test_macro にはftp 接続後に実行する処理を書きます。


これらを実行させる方法は、

ftp > $test_macro

です。


.netrc は ls コマンドの -lオプションでは表示されない、
. (ドット)から始まるファイルのため、-a オプションを付けて表示させられます。( ls -al )
しかも、接続先に設定ファイルがあるわけではなく、
接続元という点がミソです。

お陰でこのファイルの存在を発見するまでに多大な時間を費やしてしまいました。。。
が、これで一つ勉強になりました♪

もし ftp 接続で得体の知れない処理をしていたら、
これが原因かもしれませんよww

posted by ぃぬっくす at 00:05| 東京 曇り| Comment(0) | Linux | このブログの読者になる | 更新情報をチェックする

2008年09月14日

cron設定の注意点

今Linux系のOSを使う機会が多いのですが、
あるきっかけからでcron設定をすることに。。。


cronとはWindowsにあるタスクという機能と同じく、
規定の時間に規定の処理を呼び出し
実行させるための仕組みです。


$ su
# cd /var/spool/cron (cron 設定ファイルのあるディレクトリへ移動)
# crontab -e (root ユーザの設定をする場合)
# crontab -u guest -e (guest ユーザの設定をする場合)
# crontab -u guest ファイル名 (guest ユーザのcron設定をインポートする場合)

スーパーユーザになり、
cronの設定ファイルのディレクトリへ移動し、
crontabコマンドを実行します。
ここで注意するのは、ログインユーザのcron設定が編集されるという点。
もし他のユーザのcron設定をする場合、
-u オプションを指定しなければならない。
cron設定ファイルはインポートもできるが、
-u オプションをつけ忘れると、
ログインユーザの設定ファイルに上書きしてしまうので要注意!!

現に初めて設定している時に
間違えて上書きしてしまいました。
ただ、その時はバックアップを取っていたから
すぐにリストアし直しました。

もしも今後cron設定をされる機会がある方は、
ご注意ください!(>□<;)

posted by ぃぬっくす at 23:55| 東京 曇り| Comment(0) | Linux | このブログの読者になる | 更新情報をチェックする

2008年08月26日

ブータブル Linux

先週の週末から取り組んでいた
USBブート可能なコンパクトLinuxを作ってみました。

まず、以下のモノを用意します。
各項目に記載しているのは私が使用したものです。
各自の好きなディストリビューションやバージョンに変更しても
問題ないと思います。


  • USBフラッシュメモリ (1GB以上推奨、FAT32フォーマット)
    −600-UA2G (Ready Boost対応)

  • Linuxディストリビューション イメージ
    Puppy Linuxpuppy-4.00.3-JP.iso

  • SYSLINUX
    syslinux-3.71.zip

  • isoイメージ読み込み用ツール
    DEAMON TOOL

  • USBブート可能なPC (最近のPCならほとんど問題ないらしい)
    −自作機

準備ができたら、いよいよUSBブート対応Linuxを作ります。
作業はたったの6ステップ

1.DEAMON  TOOLを使ってDLしたLinuxイメージを読み込む。
2./boot/isolinuxディレクトリ以下のファイルをUSBメモリのルートディレクトリにコピー 。
3./KNOPPIXディレクトリをディレクトリごとUSBメモリにコピー。
4.USBのルートディレクトリにコピーしたisolinux.cfgをsyslinux.cfgにリネーム。
5.リネームしたsyslinux.cfgをエディタで開き、pmedia=cd を pmedia=usbflashに書き換える。
6.[スタート] − [ファイル名を指定して実行]から
  「\syslinuxの解凍先\win32\syslinux.exe -a d:」を入力して「OK」をクリック。
  (※USBのドライブ文字がDの場合

たったこれだけで完成しました♪
手順6でちゃんとできているか通常の設定では確認できませんが、
どうしても気になる方は、
[ファイル オプション]−[表示]タブで詳細設定の一番下にある
「保護されたオペーレーションシステム ファイルを表示しない」のチェックを外すと、
USBルートディレクトリに「ldlinux.sys」というファイルが現れればOKです。

あとは、PCにUSBをさして起動時にUSBからブートさせればPuppy Linuxが起動します。
ちなみに私の環境ではPS/2マウスでは、動いてはいるようですがポインタが表示されませんでした。
USBマウスなら問題なく使えました。
とりあえずは、USBブートLinuxができたので良しとします☆

もし今回の記事で何か質問などがあればコメントにお願いします。


参考にしたサイト:『USBメモリでKNOPPIX v5.01を起動
参考にしたサイト:『遊ぶエンジニア
posted by ぃぬっくす at 22:04| 東京 雨| Comment(0) | Linux | このブログの読者になる | 更新情報をチェックする

2008年04月20日

パスワード生成ツール

Javaでパスワード生成用のツールをGUIベースで作ってみました。

著作権は放棄しませんが、
勝手に改変、再配布していただいてかまいません。
その際はココから取ってきたことが分かるようにしてくれればOKです。


ダウンロードパスワード生成ツール

注:Javaのランタイムが入っていることが必須です。(現在の最新版ver.1.6.0_04)
  なお、動作確認は最新版でのみ行なっています。
posted by ぃぬっくす at 01:52| 東京 雨| Comment(0) | プログラム | このブログの読者になる | 更新情報をチェックする