Quantcast
Channel: パークのソフトウエア開発者ブログ|ICT技術(Java・Android・iPhone・C・Ruby)なら株式会社パークにお任せください
Viewing all 138 articles
Browse latest View live

Go 言語と D 言語でスリープソートを実装してみた

$
0
0

スリープソートは 2011 年に考案された新進気鋭のソートアルゴリズムです。
そのあまりの斬新さに感動してしまったちかです
ということで自分でも実装してみました。

Go 言語と D 言語の比較記事ではありません。あしからず。
Go 言語や D 言語の解説記事でもありません。あしからず。

Go 言語

package main import "time" func sleepsort(values []uint) <-chan uint {    sortedChannel := make(chan uint)    for _, value := range values {        go func(value uint) {            time.Sleep(time.Duration(value) * time.Second)            sortedChannel <- value        }(value)    }    return sortedChannel} func main() {    values := []uint{ 5, 2, 19, 11, 7, 13, 3, 17 }    sortedChannel := sleepsort(values)    for range values {        println(<-sortedChannel)    }}

D 言語

import std.stdio;import std.parallelism;import core.thread; unittest{    uint[] result;    sleepsort!(x => result ~= x)([2, 1, 4, 0, 2]);    assert(result == [0, 1, 2, 2, 4]);}void sleepsort(alias callback)(uint[] values){    auto pool = new TaskPool(values.length);    foreach (value; pool.parallel(values))    {        Thread.sleep(value.seconds);        callback(value);    }    pool.finish(true);} void main(){    sleepsort!writeln([5, 2, 19, 11, 7, 13, 3, 17]);}

アルゴリズム

スリープソートのアルゴリズムは非常にシンプルです。
「値に比例する時間だけスリープしたあと値を出力する」という処理を全要素で一斉に行います。

私は「その発想はなかった!」と感動したのですが、いかがでしょうか。

Go 言語の実装では、要素数分の goroutine (軽量スレッド) を立ち上げて、
各 goroutine で要素値 [秒] だけスリープしたあとチャネルに値を渡しています。

D 言語の実装では、要素数分のタスクプールを作って、
各タスクで要素値 [秒] だけスリープしたあとコールバック関数に値を渡しています。

参考


Automatorでエラーダイアログを出す

$
0
0

MacのGUI操作の自動再生アプリ「Automator」で、
エラーダイアログを出す方法をご紹介します。

今回はスクリプトから出力されたメッセージで
エラーダイアログを出すか否かを判定するAppleScriptを書きました。

①シェルを実行させる


以下は特定のファイルをFAXするジョブがキューにあるかを調べて、
あればFAX完了とみなすスクリプトです。

#!/bin/bash
if [ $# -ne 1 ]
then
echo "引数は1つだけ指定してください。"
exit 1
fi

filename=$1

while [ -n "`lpq -a | grep $filename`" ]
do
# シェル起動時から300秒経過した場合はタイムアウト
if [ $SECONDS -ge 300 ]
then
echo "タイムアウトしました。"
exit 1
fi
sleep 5
done

echo "成功しました。"
exit 0

AppleScriptでシェルの結果を扱うために、
4・15・21行目で実行結果を標準出力に出力しています。

このシェルをAutomatorのシェルから呼び出します。
([ライブラリー] > [ユーティリティ]>[シェルスクリプトを実行])
シェル:/bin/bash
入力の引き渡し方法:stdin から

$HOME/Desktop/pollingJob.sh hoge.pdf
# 0以外を返すとAutomatorがエラーと判断して実行がSTOPします
exit 0


②AppleScriptでエラーメッセージを受け取る

以下は①で標準出力されたメッセージによって
エラーダイアログを表示するAppleScriptです。
( [ライブラリー]>[ユーティリティ]>[AppleScriptを実行])

on run {input, parameters}
set message to item 1 of input
if message is equal to "成功しました。" then
return input
end if

display dialog message buttons {"OK"} with icon 0
error message -- これがあるとAutomatorのログにmessageが表示される
end run


icon の後ろに指定する数値によって、ダイアログの種類が変わります。
0 => エラー
1 => 通常
2 => 警告

clang analyzer

$
0
0

はじめに

clangの静的解析機能をlinux上でも使ってみようという趣旨の記事です。

clangとは

clangはmacのxcodeでも使用されているC/C++/Objective-Cのコンパイラです。
コンパイラ基盤のLLVMのフロントエンドとして動作しオプションなどはgccと互換性があります。
gccと比較して最適化に長けていて、警告やエラーメッセージが判りやすいなどの特徴があります。

環境

CentOS 6.6 x86_64

インストール方法

EPELリポジトリの登録

CentOSには標準でclangのパッケージが用意されていないのでEPEL拡張パッケージのリポジトリを追加します。

# wget http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm
# rpm -ivh epel-release-6-8.noarch.rpm

clang-analyzerのインストール



# yum install clang-analyzer
(1/4): clang-3.4.2-4.el6.x86_64.rpm | 20 MB 00:19
(2/4): clang-analyzer-3.4.2-4.el6.noarch.rpm | 77 kB 00:00
(3/4): llvm-3.4.2-4.el6.x86_64.rpm | 1.2 MB 00:01
(4/4): llvm-libs-3.4.2-4.el6.x86_64.rpm | 7.8 MB 00:04

依存するLLVMとclangもインストールされます。

使い方

以下のような些末なコードがあったとして・・・

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int func(const char *str, char **dest)
{
*dest = strdup(str);
if (*dest == NULL) return -1;
char *pos = strstr(*dest, "foo");
if (pos != NULL) memcpy(pos, "bar", 3);
return 0;
}

int main(int argc, char **argv)
{
char* src = argv[1];
char* dest;
int ret = func(src, &dest);
printf("%s => %s\n", src, dest);
// free(dest);
return 0;
}


clangの--analyzeオプションで解析



$ clang --analyze zzz.c
zzz.c:19:5: warning: Value stored to 'ret' is never read
ret = func(src, &dest);
^ ~~~~~~~~~~~~~~~~
zzz.c:22:5: warning: Potential leak of memory pointed to by 'dest'
return 0;
^~~~~~~~
2 warnings generated.


scan-buildコマンドでHTMLレポートを作成



$ scan-build clang zzz.c
scan-build: Using '/usr/bin/clang' for static analysis
zzz.c:19:5: warning: Value stored to 'ret' is never read
ret = func(src, &dest);
^ ~~~~~~~~~~~~~~~~
zzz.c:22:5: warning: Potential leak of memory pointed to by 'dest'
return 0;
^~~~~~~~
2 warnings generated.
scan-build: 2 bugs found.
scan-build: Run 'scan-view /tmp/scan-build-2015-04-26-145938-25383-1' to examine bug reports.

$ scan-view /tmp/scan-build-2015-04-26-145938-25383-1
Starting scan-view at: http://127.0.0.1:8181
Use Ctrl-C to exit.


以下のようなHTMLレポートが作成されます。
scan-build


現実世界では単一のソースファイルに静的解析出来てもあまりうれしくないです・・・
以下はcmakeのプロジェクトに対して使用する場合です。

cmakeで使用する場合



$ cmake -DCMAKE_C_COMPILER=/usr/libexec/clang-analyzer/scan-build/ccc-analyzer -DCMAKE_CXX_COMPILE=/usr/libexec/clang-analyzer/scan-build/c++-analyzer /path/to/src
$ make


最終的なビルドはgccを使用する場合でも静的解析用途に使ってみてはいかがでしょうか?

NoClassDefFoundError(Eclipse×外部jar) その2

$
0
0
皆様、お久しぶりです、紅焔です

去年5月に書いた前回記事とはまた別件でjspで外部のjarファイルを使用する時に少しトラブったのでご紹介しておきます

あるモジュール(jar)を組み込むため、WebContentのWEB-INF/libにそのjarを置きました。
ここまでは、バッチリ!
前回の反省を活かしてますね

このモジュールは、axis2等必要なjarファイルを同時に参照に含めないと使えない仕様です。
ライセンス上などの問題も考慮し、外出ししてあるのです。
これらのjarファイルをまとめたフォルダをWebContentのWEB-INF/libに置いて、ビルドパスを通す。
これで、動くはず…!

java.lang.NoClassDefFoundError

はい、出ましたー…。
ちゃんとWEB-INF/libに入っているはずなのに…。

答えはこうでした。
使用する全てのjarファイルはWEB-INF/libのフォルダそのものに入っていなければならない
子フォルダに置いていてもダメなんですねぇ…。

些細な事で躓く人が少なくなることを願い、締めとさせて頂きます。

Forthをつかってみた

$
0
0

はじめに

こんにちは。バグ太郎です。

タイトルの通り、今回は興味本位で調べたForthについて記事にしてみたいと思います。
Forthの主な特徴は手続き型でスタック指向、コードの記述に後置記法を用いる点です。

特徴

後置記法

後置記法は逆ポーランド記法とも言います。
「1 + 2」という式(中置記法)を例とすると、後置記法では「1 2 +」と表現します。
後置記法は日本語の文法と似ている。と評されますが、
「1 2 +」を「1と2を足す」と読むことができる為です。
まあ、日本語と文法が似ていること自体はForthにおいて特に利点にはなりません。
日本において「1 + 2」という式でも普通に「1足す2」で通じますし。
日本語の文法そのままに日本語で記述できるMindというForthベースの言語もありますが、
Forthにおいて後置記法を採用しているのは「コンピュータで利用するのに適した形にしたかったから」と、単純に考えてよいかと思います。

スタック指向

Forthのデータ構造はスタックです。
後置記法と組み合わせることで明確なデータスタックを用いることができます。
「1 2 +」の場合、1を積み、2を積み、2値を取り出して、結果を積みます。
気をつけることといえば、pushとpopしたときのスタックポインタの移動する方向でしょうか。
スタックなので当たり前ですが「1 2」と積んだ場合「2 1」という順番で取り出します。

手続き型

Forthは複数の命令を組み合わせて、実行する一連のステップを記述します。
中置記法は演算子が数字の間に入るので「1+2」と書くことができますが、
後置記法は数字が続くために「12+」と空白を除いて書くことができません。
Forthにおいて各命令のデリミタには空白を用いるため、違和感なく「1 2 +」と同様の記述ができます。
実装してみると分かるのですが、適当なとこで改行しないと書いたコードを読み返したくはないです。
しかし命令ごとに改行すると過剰になって、無駄に縦に長くなります。

実行

Forthの環境はコンパイラとシェルが混ざったような感じです。
一時的に実行を試すための環境が欲しい方はWebサービスを探してみるとよいかもしれません。
Forthはコンパイルしなくても基本的な命令は対話形式でそのまま実行できます。
もちろんサブルーチン(Forthではwordsという)を定義し、それを対話形式で呼び出すこともできます。

「1 2 +」の結果を出力

# 1 2 + .


定義するときは以下のような形で記述します。

wordsの定義

: ワード名 文 ;


ためしにFizzbuzzなるものを実装してみました。
最初は思い描いた平凡なフロー通りに書いて無駄が多かったのですが、スタック指向を理解するにつれ変形させていくのが楽しかったです。
みなさんも試しに実行してみてはいかがでしょうか。私が使用した主なワードは以下の通りです。
ちなみに、繰り返しなどの一部制御文を使用する場合はコンパイルが必要になるようです。

・dup
 値をpopして複製してpushする。
・mod
 剰余算を行う
・if - then:if 文 [else 文 ]then
 分岐処理を行う。Forthにおいて0以外は真の扱いらしい。thenはendifでもよい。
・.(ピリオド)
 値をpopして出力する。文字列を出力する場合は." XXX"と記述する。
・cr
 改行を行う。
・do - loop: 終了値 開始値 do 文 loop
 100 1 do なら1から99までくり返す。iと記載すると現在値がpushされる


以下が私が実装したものになります。"最大値 fizzbuzz"と打ち込んで実行します。
0=を使用しているのはorは使えたのになぜかnorやnotが使用できなかったためです。

私が考えたForthのFizzbuzz

: fizzbuzz
cr
1 + 1 do
i 5 mod 0= i 3 mod 0= 2dup or 0=
if i . then if ." Fizz" then if ." Buzz" then
cr
loop
;

意味単位で成型すればこんな感じ?

: fizzbuzz
cr
1 + 1 do
i 5 mod 0=
i 3 mod 0=
2dup or 0=
if i . then
if ." Fizz" then
if ." Buzz" then
cr
loop
;



Forthを使う機会があるかは別として、普段触れない指向を学んでみるのも面白いのではないでしょうか。

Pythonista Rubyist Scalman Gopher... じゃあ Rust は?

$
0
0

先週 Rust 1.0 がリリースされましたね!
Haskell と C++ の間のような印象を持っていますが、私はまだ実際にコードを組んだことがありません。
これから少し勉強してみるつもりです。
((日本語リソースが増えてくるまで少し待とうかな...))

Rust はシステムプログラミング言語で、関数型(←明言はしていないらしい)、パターンマッチングがあり、変数はもちろんデフォルトで不変、何より10億ドル相当の苦痛と損害がありません!
D 言語と同様、プログラマーがミスしやすいことはコンパイルエラーにしてくれそうです。
開発ツールが成熟してくれば非常に扱いやすく実用的な言語になると個人的には思っています。
((Haskell は素晴らしい言語だと思うのですが、ハードルの高さ的にちょっと... とか考えると、 Haskell 的な機能があって C っぽい文法を持つ Rust は実用的かも、という意味で。 Scala のことは後で考える。))
((中核概念の 1 つ『オーナーシップ』が広く受け入れられるには時間がかかる気も... C++ やってると受け入れやすいと思うけど C++ の人口って...))

参考

さて
プログラミング言語には使い手に敬意を表した呼び方がありますよね。
たとえば Python 使いを Pythonista, Ruby 使いを Rubyist と呼んだりします。
Go 言語を扱う人のことは Gopher と呼ぶらしいです。
((私は Gopher はゴメンです))
Scala の Scalman(スカルマン) もおもしろい。

では
Rust を扱う人は何と呼びましょう??
決めの問題かとは思いますが
やはり Rustafarian でしょうか。
あるいは Rusterizer でしょうか。

そんなくだらないことばかり気にしてしまうちかでした

ちなみに
Rust Samurai というと Rust 勉強会コミュニティの 1 つ (またはその主宰者) になります。
「JavaScript Ninjaがいるんだから、Rust Samuraiが居てもいいだろ。Mozilla的に」 というギャグから始まった企画。 とのこと。すばらしいネーミング!

x86_64の呼び出し規約

$
0
0

下記のようなCのコードがあります。

#include <stdio.h>#include <stdarg.h>static long sum(int n, ...){    long total = 0;    va_list ap;    va_start(ap, n);    int i;    for (i=0; i < n; i++)    {        total += va_arg(ap, long);    }    va_end(ap);    return total;}int main(int argc, char *argv[]){    printf("a) %ld\n", sum(10, -1L, -2L, -3L, -4L, -5L, -6L, -7L, -8L, -9L, -10L));    printf("b) %ld\n", sum(5, 1, 2, 3, 4, 5));    printf("c) %ld\n", sum(10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10));    return 0;}
このコードを64bitのLinux上でビルドします。
 $ gcc -m64 -Wall -g -o sample sample.c
実行すると以下の結果が得られます
 $ ./sample a) -55 b) 15 c) -21474836425

c)の結果が55でないのはlong(64bit)の引数にint(32bit)と解釈される1..10を渡してるからでしょ?
ちゃんと 1L とか (long)1 とかすれば?と思いますよね。ご尤もその通りです。

でも b) はなんで正しい結果が得られてるのに c)はダメなの?というのが今回の本題。

調べたところ、関数の呼び出し規約 がx86_64の場合、

  • 整数・ポインタ引数 : RDI, RSI, RDX, RCX, R8, R9 の6個のレジスタ
  • 浮動小数点引数 : XMM0 ~ XMM7 の8個のレジスタ

が使用され、これ以上の引数はスタックに積まれて渡されます。


よって b) のケースでは 6個の引数なので全てレジスタ(64bit)に格納されてセーフ
c) のケースでは 6 ~ 10 がスタックに32bitずつしかコピーされずにアウトという理由でした。

objdumpで逆アセしてみると 6~10までが movlで32bitしかコピーされていないことが判ります。

  $ objdump -S sample    :  printf("c) %ld\n", sum(10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10));  4006fd:       c7 44 24 20 0a 00 00    movl   $0xa,0x20(%rsp)  400704:       00  400705:       c7 44 24 18 09 00 00    movl   $0x9,0x18(%rsp)  40070c:       00  40070d:       c7 44 24 10 08 00 00    movl   $0x8,0x10(%rsp)  400714:       00  400715:       c7 44 24 08 07 00 00    movl   $0x7,0x8(%rsp)  40071c:       00  40071d:       c7 04 24 06 00 00 00    movl   $0x6,(%rsp)  400724:       41 b9 05 00 00 00       mov    $0x5,%r9d  40072a:       41 b8 04 00 00 00       mov    $0x4,%r8d  400730:       b9 03 00 00 00          mov    $0x3,%ecx  400735:       ba 02 00 00 00          mov    $0x2,%edx  40073a:       be 01 00 00 00          mov    $0x1,%esi  40073f:       bf 0a 00 00 00          mov    $0xa,%edi  400744:       b8 00 00 00 00          mov    $0x0,%eax  400749:       e8 e2 fd ff ff          callq  400530 <sum>    :

キチンとサフィックスLを付けると以下のようにmovqで64bitコピーされ正しい結果が得られます。
  printf("c) %ld\n", sum(10, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L));  400760:       48 c7 44 24 20 0a 00    movq   $0xa,0x20(%rsp)  400767:       00 00  400769:       48 c7 44 24 18 09 00    movq   $0x9,0x18(%rsp)  400770:       00 00  400772:       48 c7 44 24 10 08 00    movq   $0x8,0x10(%rsp)  400779:       00 00  40077b:       48 c7 44 24 08 07 00    movq   $0x7,0x8(%rsp)  400782:       00 00  400784:       48 c7 04 24 06 00 00    movq   $0x6,(%rsp)  40078b:       00  40078c:       41 b9 05 00 00 00       mov    $0x5,%r9d  400792:       41 b8 04 00 00 00       mov    $0x4,%r8d  400798:       b9 03 00 00 00          mov    $0x3,%ecx  40079d:       ba 02 00 00 00          mov    $0x2,%edx  4007a2:       be 01 00 00 00          mov    $0x1,%esi  4007a7:       bf 0a 00 00 00          mov    $0xa,%edi  4007ac:       b8 00 00 00 00          mov    $0x0,%eax  4007b1:       e8 7a fd ff ff          callq  400530 <sum>    :
寧ろ、c) より b) が正しい結果を得られる事の方が恐ろしいですね。

(printfなど標準関数を除いて)可変引数は警告出ないので気を付けましょう。
そんなにたくさんの引数を使うことは希でしょうが・・・

Windows Server 2008 コマンドで役割と機能を確認する

$
0
0

servermanagercmdコマンドで、コンポーネントを確認することができます。




コンポーネントの確認は、「-query」オプションを付けて実行する。

追加可能な機能や役割の一覧と、インストールされているかどうか表示される。

先頭が[ ]となっている行は未インストール、「[X]」となっている行(緑色の文字)がインストール済み。




インストール済みが視覚的にわかりやすいので、サーバー構築作業時の確認や、エビデンス取得に使えるのでは、ないでしょうか。




servermanagercmd -query を実行!




役割








機能





servermanagercmd -query > エビデンス.txt


で、テキスト出力されます。↓こんな感じ













-installオプションでコンポーネントをインストールすることも可能です。コンポーネント名は、各行の最後の[コンポーネント名]を利用します。



PowerShellでNTDS&サーバーコンテナー追加

$
0
0

PowerShellでNTDSとサーバーコンテナーの追加




#サイト追加


New-ADObject -Name "second" -Type Site -Path "CN=Sites,CN=Configuration,DC=first,DC=local"


#NTDS追加


New-ADObject -Name "NTDS Site Settings" -Type NTDSSiteSettings -Path "CN=second,CN=Sites,CN=Configuration,DC=first,DC=local"


#コンテナー追加


New-ADObject -Name "Servers" -Type serversContainer -Path "CN=second,CN=Sites,CN=Configuration,DC=first,DC=local"








実行結果







CIの実現について考察

$
0
0

はじめに

こんにちは。バグ太郎です。

表題の通りですが、最近身の回りではJenkinsなどを用いて
テストを継続的に行うような環境を作る動きが活発になっているような気がします。

たとえばJavaの場合、Jenkinsでスケジューリングしプロジェクトのビルドをトリガに
findbugsを用いて静的テストを行い、junitやjmokitを用いて単体テストを行い、
coverturaを持ちいてカバレッジの集計なんかができます。

そこまでやるならぜひ結合テストをやりたいと思った所存です。といってもUIテストですが。
そこで白羽の矢が立ったのがSikuliです。

Sikuliとは,

Sikuli scriptといって、画像認識でGUI操作を自動化する所謂マクロツールです。
専用のIDEが存在し、操作の対象を探索するための画像を表示しながら
コーディングすることができるという特徴があります。
他にも色々特徴はあるのですが、今回のミソはJVM上で動作することです。
専用のIDE上ではJRubyやJythonで記載するようですが、
ようはこいつの本体はjarで、中身はjavaです。

なぜSikuli?

JenkinsでCIを実現するにあたって、
一番楽な連携は結果をxmlで出力することだと(勝手に)思っています。
junitなどもビルドから実行が始まり、Jenkins上から集計なんて言ってますが
ただ結果のxmlを参照してるだけです。
ようは、junitと同じように結果を出力してしまえばいいわけです。
SikuliのAPIはjarで提供されていますから、当然JunitTestの実装でもインポートして使えます。
つまり、

JunitでSikuliを用いてUIテストを行い、結果をJenkinsに渡す


という構想なわけです。

JunitとJenkinsの関係性そのままです。特にPluginなどは使いません。
なので実現は非常に簡単な部類かと思います。すごい。


問題点は画像認証のマクロツールという立場上、
テストの手順は必ず再現できるものでなければいけないことでしょうか...
表示や遷移が頻繁に変わることのない画面系のテストか、リグレッションテストが主な用途になるかと思います。


シリーズ化したら、次回は実際に作成してみたいと思います。では。

bitnami

$
0
0

bitnamiとは
Webアプリケーションや開発環境などをオールインワンでインストール出来るパッケージを配布しているサービスです。
例えばWordpressやRedmineを言語環境のバージョンやDBなどを意識せずワンクリック(やや誇張)でインストール出来ます。

bitnami_logo

インストール先
Windows, MacOS, Linux, VMイメージ, Dockerコンテナ, クラウドと多岐に渡ります。
ちょっと試したいときにローカルのPCにスタンドアロンでインストール出来るのは便利です。

配布アプリケーション
下記リンクを見れば一目瞭然ですが、Wiki、CMS、eコマース、開発環境、アプリケーションサーバなど・・・
「comming soon」もたくさんあり、有償ソフトのトライアルもあります。
何より色々なアプリや環境がリスト化されていて勉強にもなります。
https://bitnami.com/stacks


利用するメリット
・java,PHP,Python,Ruby,Nodeなど実行言語やversionを気にせずにインストールして試すことが出来る
・言語と同様にDatabaseサーバやWebサーバなどのversionを気にせず試せる
・アンインストールが楽ちん
・インストールのコストが僅かなのでデファクトでない様々なアプリや環境を試せる

オールインワンインストーラは以前からありましたが、配布元や手順が統一化されていると安心感というかブランド力を感じてしまいます。

Mono

$
0
0

手持ちにMac(とVM上のLinux)しかない人がC#プログラム(練習問題レベル)をビルド検証する必要に迫られた際の覚え書きです。

Monoとは
.NET Framework互換環境をLinuxやMacOSなどに実現するオープンソースプロジェクト。
iOS/Androidでクロス開発を実現するXamarinやゲームエンジンのUnityでも利用されています。

インストール
下記URLからダウンロードしてインストールします。
MacOS,Linux,Windows版があります。
http://www.mono-project.com/download/


プログラムのビルド方法
こんなコードがあったとして、、


class TestClass
{
static void Main(string[] args)
{
System.Console.WriteLine(args.Length);
}
}


コマンドラインからmcsコマンドでビルドします。

$ mcs TestClass.cs

TestClass.exeが出力されます。

実行方法
monoコマンドの引数にビルドして出来たアセンブリを指定して実行します。

$ mono TestClass.exe 1 2 3
3


互換性など
基本となるクラスライブラリは互換性があるようです。
UIはWPFは駄目だけどWinformsならある程度サポートされておりそれなりに動きそう(?)
尤もUI部分はクラスを分離してプラットフォームに適合したツールキットを利用するのがポリシーの模様。Win32APIの呼び出しは当然×

Tomcat8 ハングアップ 起動しない

$
0
0

会員No.18です。

TomcatをLinuxでinitd(CentOS や Redhat の7系だとsystemdが一般的)でサービス登録、起動することがありますが、Tomcat8をサービス起動した際にハングアップしたことがあったので記事にします。
※Tomcat7では発生しません。

■環境
Red Hat Enterprise Linux 7.1
JavaVersion 8 Update 45
Tomcat8.0.23

■現象
Tomcat8起動時にsetenv.shで下記のようにCLASSPATHを設定していました。
--setenv.shの内容 ここから--
export CLASSPATH="$CLASSPATH:xxx:yyy:zzz"
--setenv.shの内容 ここまで--

上記設定で$CLASSPATHがブランクの場合、CLASSPATHが:(コロン)から始まる文字列になり、Tomcat8が起動時にハングアップしてしまいます。

(参考) https://bz.apache.org/bugzilla/show_bug.cgi?id=57823


■対処
$CLASSPATHがブランクの場合はsetenv.shから必要のない$CLASSPATH:を削除する。

・修正前
export CLASSPATH="$CLASSPATH:xxx:yyy:zzz"

・修正後
export CLASSPATH="xxx:yyy:zzz"

ブロックチェーン

$
0
0

会員No.18です。

ブロックチェーンはインフラだけでなくいろいろ応用が効くので世の中を変えそうな気がする。
下記ページにあるmijinの説明動画のナレーションが恐らく北斗の拳の声優の方で面白いです。

http://jp.techcrunch.com/2015/09/25/mijin/

MySQL -恐怖の設定ファイル、エラー1067-

$
0
0

こんにちは、むらしです。初投稿となります。
”こんなこともわからねーのか”というような事ばかり書くと思いますが、何かに役立てば幸いです。

DBの勉強をするためにMySQLを自宅パソコンにインストールすることになりました。
その時に設定ファイルで詰まってしまいましたが、以下の方法で解決しましたのでまとめておきます。

今回は勉強ということもあり、インストーラーを使わずに行いました(*1)。順を追って書いていきますので、インストーラ無しでインストールする方の手助けになれば幸いです(設定ファイルの内容は意図的に間違えています。ですので最後まで読んでください!!)。

今回OSとしてwindows7、使用するMySQLのバージョンは5.6を用いました。

順を追って説明していきます。

まずダウンロードしたものを任意の場所(僕の場合はC直下)に解凍、そしてコマンドプロンプトで(MySQLフォルダ/bin)に移動します。次に

mysqld.exe --install(ハイフンは2つ)

と打ちます(環境変数をこのフォルダに設定しておくと楽です、下記からは設定したものとして進めます(*2)。

次に設定ファイルを作成し、指定のフォルダへ置きます。今回は「my.ini」というファイルを作成し、中身に以下の内容を書き込みました。指定のフォルダは、僕の環境では"C:/windows"でした(*3)。

//////////////my.ini///////////////////

[mysqld]
basedir = C:/(MySQLフォルダ)/
datadir = C:/(MySQLフォルダ)/data
default-character-set = utf8

[mysql]
default-character-set = utf8

///////////////////////////////////////

MySQLのサービスを開始します。方法は「コントロールパネル」→「管理ツール」→「サービス」に移動してMySQLを選択し、”サービスを開始”をクリック。コマンドプロンプトで行う場合は、管理者権限で実行して

net start mysql

と打つとサービスが開始されます。…のはずが以下の内容がポップアップで表示されました。

ローカルコンピュータのMySQLサービスを開始できません。エラー1067:プロセスを途中で強制終了しました

コマンドプロンプトで開始しようとすると以下の内容が…

MySQL サービスを開始します…MySQL サービスを開始できませんでした。システムエラーが発生しました。システムエラー1067が発生しました。プロセスを途中で強制しました。

エラー1067が立ちはだかります。再起動してみたり、設定ファイルを何回も見たり…時間が水のように流れます。調べたところ、このエラーは設定ファイルの"my.ini"が原因であるようです。汎用エラーコードのため、特定できませんので、設定ファイル内のパラメータをコメントアウト(*4)するなりして、ひたすらサービスを開始し続けます(*5)。そして[mysqld]の"default-character-set = utf8"をコメントアウトすると…

開始出来ました!!!

よくわからないけど出来たからいいや…いや、何かひっかかる。スペルミスはなかったはずなのに…!?調べたところ、"default-character-set"は、MySQL5.5から表記が変わったようです。正しくは"character-server-set"。設定ファイル"my.ini"を以下のように書き直します。

//////////////my.ini///////////////////

[mysqld]
basedir = C:/(MySQLフォルダ)/
datadir = C:/(MySQLフォルダ)/data
character-server-set = utf8

[mysql]
default-character-set = utf8

///////////////////////////////////////

これでサービス開始したところ、うまく開始出来ました。安心、安心…。
コマンドプロンプトでmysql -u rootでMySQLのコンソールに移ります。


せっかくなので設定ファイルについて軽くお勉強してみました。
設定ファイルはmysqlをコンソール上で実行した時に起動オプションとして実行されるもののようです(そこからか!)。設定ファイルが読み込まれる場所なのですが、デフォルトでは3か所あるようです(下記)。

●(WINDIR)¥my.ini(*3)
●C:¥my.cnf
●(MySQLフォルダ)¥my.ini

設定ファイル名は"my.ini"又は"my.cnf"、複数置いてしまうと、パソコンがどれを読み込んでよいのかわからなくなるのでやめましょう。

中身はクライアントセクションサーバーセクションに分かれているようです。

<クライアントセクション>
[mysql]はクライアントが参照します。クライアントセクションには他に[client]があります。[client]は、設定ファイルを参照するクライアント全てに適用されるのに対して、[mysql]はMySQLコマンドラインツール(mysql)だけが参照するようです。
<サーバーセクション>
[mysqld]はMySQLサーバが利用します。

mysqlを実行する時に起動オプションを付けますが(例えば"mysql -u root")、この起動オプションを設定ファイルに書き込んであげれば(mysqlで実行するので[mysql]内に記述)、いちいち入力しなくてすみます。
起動オプションは"mysql --help"と入力してあげると、一覧が出力されす。起動オプションを紹介しているサイト様もあるようなので、そちらも参考にしてみると良いかもしれません。default-storage-engine=InnoDBとか便利かもしれません(デフォルトのストレージエンジン変更)。


これでやっと勉強が始められる…本当に環境設定って嫌いです。


(*1)MySQL(http://dev.mysql.com/)のMySQL Community Serverのダウンロードページに飛び、
アーカイブ版をダウンロード
(*2)コマンドプロンプトに"setx"という、環境変数を設定するコマンドがあるようです
(setと異なり、永続的)
(*3)確認するには、コマンドプロンプトで"echo %WINDIR"と打ちましょう
(*4)"#"でコメントアウト出来るようです
(*5)設定ファイルで指定したdataフォルダの中に(コンピュータ名).errファイルがあるのです
が、そこを見ればエラーになったパラメータがわかりました

参考サイト
http://d.hatena.ne.jp/nightmare_tim/20110530/1306704112
http://darutk-oboegaki.blogspot.jp/2014/03/mysql-error-1067-process-terminated.html
http://www.dbonline.jp/mysql/myini/


アノテーションの時代~web.xmlが要らなくなる日~

$
0
0
アメンバー限定公開記事です。

ruby試験に向けて

$
0
0

はじめまして、こにしです。


今回初めての投稿なので、しょぼくても怒らないでくださいね。

今、10月に受けるrubyシルバー試験に向けて勉強中です。

今まで、やってきたC言語やJAVAとは全く違くてなかなかギャップに戸惑ってます。

しかし、やっているのが暗号みたいものを解読している気分でこれはこれでたのしいので

この試験を受かり、ゴールド試験への道を切り引けたらなぁと思ってます。


しかし、今までのプログラムとはギャップが激しくてなかなか試験のプログラムを見ても

頭でどういう動きなのかがイメージがわかなくて難しいです。


自分のなかで一番ギャップを感じている部分は
変数に型がないってことです。
今までは

int a = 1;
String str = "abc";

など、宣言することで使っていたものが

a = "abc"
a = 1

rubyでは宣言しないので利点そしてはキャストなどの変数を変換みたいなものがないですが
C言語やjavaに慣れてしまっているので型がないのは混乱しています。

DJUNITで使ったMethodクラスの紹介

$
0
0

お久しぶりです。こにしです。


今回はDJUNITでテスト実装しているので
そこでよく使っていて、自分は知らなかったのでMethod文を紹介しようと思います。

Method文
主にクラス内あるメソッドを強制的に呼び出すことができるものです。
なので、主にprivateのメソッドも呼び出すことができます。


使い方


//呼びたいクラスを宣言
SampleClass sampleclass = new SampleClass();


Class[] cls = {第1引数のクラス,第2引数のクラス};

Object[] obj = {第1引数の値,第2引数の値};

Method test = sampleclass.Class.getDeclaredMethod("ここに呼びたいメソッド名",
                             cls);
//privateメソッドにアクセス可能にする
test.setAccessible(true);

test.invoke(sampleclass,obj);

と以上で呼び出せるはずです。
また引数がない場合は、invokeとgetDeclaredMethodの引数をnullにすることでできます。


と今回自分が知らなかったプログラムを紹介しました。
もし知らなかった人は是非使ってみてください。


以上
こにしでした。

Webページのアクセス解析を行うには(上)

$
0
0

(ブログや、開設しているHPのアクセス解析について調査、設定することがありました。

「Webページのアクセス解析を行うには(上)」「Webページのアクセス解析を行うには(下)」
で、Google Analytics(グーグル・アナリティクス)の設定手順について簡単に記載します。


◆アクセスログ解析とは
 自身が管理しているWebサーバの動作を記録したもの。
 Webサーバの種類によって内容は異なるが、大きくは以下のようなデータを取得し、解析し、Webサーバの運営に役立てていく。

  ・アクセス元のIPアドレス
  ・アクセス元のドメイン名
  ・アクセスされた日付と時刻
  ・アクセスされたファイル名
  ・リンク元のページのURL
  ・訪問者のWebブラウザ名やOS名
  ・処理にかかった時間
  ・受信バイト数
  ・送信バイト数
  ・サービス状態コード
  ・など

 1回の動作につき、これらの項目を列挙した1行のログデータが生成される。
 アクセスの多いサーバでは大量のアクセスログが生成されれますが、
 通常、アクセスログをそのまま管理者等が目にすることはほとんどなく、
 ログ解析ソフトなどで項目ごとに集計したものを分析します。

◆アメブロ等のアクセスログ解析
 Google信者ではありませんが、アメブロ等のサーバが提供してるアクセスログ解析は、
 値が実測値ではなく、水増しされているという色々な記事があります。

 そこで値比較のために、アメブロ等が提供しているアクセスログ解析とGoogle等が提供している
 アクセスログ解析を併用するというのが、一般的なようです。

 WEBでの集客をアクセスログ解析から判断したい等、目的を持ってWEBサーバを運営・管理している方は
 参考にしてください。

◆なぜGoogle Analyticsを選択したか
無料ブログに装備されているアクセス解析は正確な数値ではない。
Google Analyticsは、Googleの「無料」で「広告無し」正確で機能が満載のアクセス解析。
初心者には難しいというデメリットもあるらしいですが、どうせ勉強するなら・・と
ハードルを上げて今回はGoogle Analyticsを選択してみました。。

Webページのアクセス解析を行うには(下)

$
0
0

「Webページのアクセス解析を行うには(上)」につづき、「Webページのアクセス解析を行うには(下)では
Googleアナリティクス設置について記載します。


◆Googleアナリティクスでできること
 Googleが提供するアクセス解析サービスで、無料版と有料のプレミアムがあります。
 基本的には無料で下のようなことが利用できます。
  (1ヶ月あたりの上限ヒット数が1,000万ヒットまでですが)
  ・訪問数
  ・ユーザー数
  ・ページビュー数
  ・訪問別ページビュー数
  ・平均滞在時間
  ・直帰率
  ・ユーザーの分布(言語・地域)
  ・ユーザーの行動(新規とリピーター・リピートの回数や間隔)
  ・ユーザーの環境(ブラウザ・OS・プロバイダ)
  ・モバイル(OS・プロバイダ・画像解像度)
  ・訪問者のサイト内遷移
  ・訪問者の流入してきた参照元
  ・キーワード検索
  ・ソーシャル
  ・モバイル
  ・広告(Adwords)
  ・閲覧ページ・閲覧を開始したページ・離脱をしたページ
  ・サイト内検索
  ・サイトの速度
  ・ダウンロード数やクリック数などユーザーの行動
  ・e コマース(購入した商品や収益など)
  ・コンバージョン数 URL へのアクセス、サイト滞在時間、訪問別ページ数のいずれかを目標の達成をみる

 さらに・・・

  ・リアルタイムレポート
  ・カスタムレポート
  ・カスタム変数
  ・アドバンス セグメント マイレポート


◆Google Analytics を利用したアクセス解析の流れ
(1) Googleアナリティクスに申し込む
   モニターするサイトの基本情報を設定し、トラッキングIDを取得
(2) トラッキングコードを追加
   表示されたトラッキング コードをページに貼り付ける
   サイトへの訪問を Google が把握できるようする
(3) ユーザー層の詳細を確認
   数時間以内にサイトの詳細データが表示される

◆Google Analytics(グーグル・アナリティクス)設定手順
(1) < http://www.google.com/intl/ja_ALL/analytics/ > へアクセス
(2) 「ログイン または アカウントを作成」のいずれかをクリック
* Google アカウントを持っている場合は、ログインをクリック
利用内容に合わせて任意に設定
(3) Googleアナリティクスの使用を開始 <お申込み>をクリック
(4) トラッキングIDの取得のため、以下の内容を設定、<トラッキングIDを取得>をクリック
* アカウント名(必須)
* プロパティの設定
- ウェブサイト名(必須)
- ウェブサイトのURL(必須)
- 業種(任意)
- レポートのタイムゾーン
* データ共有設定
- Google のプロダクトとサービス
- ベンチマーク
- テクニカル サポート
- アカウント スペシャリスト
(5) Googleアナリティクス利用規約を読み、<同意する>をクリック
(6) 表示されている””トラッキングコードを対象のページすべてに貼り付ける

以上で、基本的な設定は完了です。

◆データが正しく取得できているか確認方法
 Google Analyticsにログインします。
 Googleアナリティクスのダッシュボードから確認します。
 トラッキング情報のステータス等は反映されるまで時間がかかります。

すぐに確認したい場合は、ほかの方法を試してください。
Viewing all 138 articles
Browse latest View live