mirror of
https://github.com/ledyba/Buffalin.git
synced 2024-05-03 19:05:27 +09:00
git-svn-id: http://ledyba.org/svn/src/Applications/ServerSideWebApps/buffalin@1 74a9cb86-dd52-4021-9b0c-c77737e5d92d
This commit is contained in:
commit
aec3b4320d
336
c_cgi/Buffalin.c
Normal file
336
c_cgi/Buffalin.c
Normal file
|
@ -0,0 +1,336 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL 0
|
||||
#endif
|
||||
|
||||
const char *Kinds[] = {"下心", "微妙さ", "優雅さ", "華麗さ", "かわいさ", "やさしさ", "やましさ",
|
||||
"やらしさ", "むなしさ", "ツンデレ", "厳しさ", "世の無常さ", "ハッタリ", "ビタミン",
|
||||
"努力", "気合", "根性", "砂糖", "食塩", "愛", "電波", "毒電波", "元気玉",
|
||||
"怨念", "大阪のおいしい水", "明太子", "勇気", "運", "電力", "小麦粉",
|
||||
"汗と涙(化合物)", "覚悟", "大人の都合", "見栄", "欲望", "嘘", "真空", "呪詛",
|
||||
"信念", "夢", "記憶", "鉄の意志", "カルシウム", "魔法", "希望", "不思議",
|
||||
"勢い", "度胸", "乙女心", "罠", "花崗岩", "宇宙の意思", "犠牲", "毒物", "鉛",
|
||||
"海水", "蛇の抜け殻", "波動", "純金", "情報", "知識", "知恵", "魂の炎", "媚び",
|
||||
"保存料", "着色料", "税金", "歌", "苦労", "柳の樹皮", "睡眠薬", "スライム",
|
||||
"アルコール", "時間", "果物", "玉露", "利益", "赤い何か", "白い何か", "鍛錬",
|
||||
"月の光", "回路", "野望", "陰謀", "雪の結晶", "株", "黒インク", "白インク",
|
||||
"カテキン", "祝福", "気の迷い", "マイナスイオン", "濃硫酸", "ミスリル", "お菓子",
|
||||
"言葉", "心の壁", "成功の鍵", "理論", "血", };
|
||||
|
||||
const char* ThingName;
|
||||
char* EscapedThingName;
|
||||
unsigned int RndSeed = 0;
|
||||
int EltCount = 0;
|
||||
struct Element{
|
||||
unsigned int kind;
|
||||
unsigned int per;
|
||||
} Elt[100];
|
||||
|
||||
char* escapeStr(const char* str,int length);
|
||||
|
||||
int main(){
|
||||
int result = 0;
|
||||
int length = 0;
|
||||
/*とりあえずは.*/
|
||||
writeContentType();
|
||||
//名前を得る
|
||||
getThingName();
|
||||
|
||||
//デコードする
|
||||
length = (int)strlen(ThingName);
|
||||
decode(ThingName,length);
|
||||
//エスケープもする
|
||||
EscapedThingName = escapeStr(ThingName,length);
|
||||
|
||||
result = doAnalyze(ThingName);
|
||||
writeHeader(EscapedThingName);//ヘッダを書く
|
||||
writeTitle();//タイトル
|
||||
writeForm(EscapedThingName);//フォーム
|
||||
|
||||
puts("<p>");
|
||||
if(result){
|
||||
writeResult(EscapedThingName);
|
||||
}else{
|
||||
writeError();
|
||||
}
|
||||
puts("</p>");
|
||||
writeAd();
|
||||
writeCounter();
|
||||
writeFooter();//フッタ
|
||||
free(EscapedThingName);//Free
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
char* escapeStr(const char* str,int length){
|
||||
int i;
|
||||
char* ret = malloc(length);
|
||||
int ret_i;
|
||||
int ret_length = length;
|
||||
for(i=0,ret_i=0;i<length;i++){
|
||||
char ch = str[i];
|
||||
switch(ch){
|
||||
case '<':
|
||||
ret_length+=4;
|
||||
ret = realloc(ret,ret_length);
|
||||
ret[ret_i+0]='&';
|
||||
ret[ret_i+1]='l';
|
||||
ret[ret_i+2]='t';
|
||||
ret[ret_i+3]=';';
|
||||
ret_i+=4;
|
||||
break;
|
||||
case '>':
|
||||
ret_length+=4;
|
||||
ret = realloc(ret,ret_length);
|
||||
ret[ret_i+0]='&';
|
||||
ret[ret_i+1]='g';
|
||||
ret[ret_i+2]='t';
|
||||
ret[ret_i+3]=';';
|
||||
ret_i+=4;
|
||||
break;
|
||||
case '&':
|
||||
ret_length+=5;
|
||||
ret = realloc(ret,ret_length);
|
||||
ret[ret_i+0]='&';
|
||||
ret[ret_i+1]='a';
|
||||
ret[ret_i+2]='m';
|
||||
ret[ret_i+3]='p';
|
||||
ret[ret_i+4]=';';
|
||||
ret_i+=5;
|
||||
break;
|
||||
case '\"':
|
||||
ret_length+=6;
|
||||
ret = realloc(ret,ret_length);
|
||||
ret[ret_i+0]='&';
|
||||
ret[ret_i+1]='q';
|
||||
ret[ret_i+2]='u';
|
||||
ret[ret_i+3]='o';
|
||||
ret[ret_i+4]='t';
|
||||
ret[ret_i+5]=';';
|
||||
ret_i+=6;
|
||||
break;
|
||||
case ' ':
|
||||
ret_length+=6;
|
||||
ret = realloc(ret,ret_length);
|
||||
ret[ret_i+0]='&';
|
||||
ret[ret_i+1]='n';
|
||||
ret[ret_i+2]='b';
|
||||
ret[ret_i+3]='s';
|
||||
ret[ret_i+4]='p';
|
||||
ret[ret_i+5]=';';
|
||||
ret_i+=6;
|
||||
break;
|
||||
default:
|
||||
ret[ret_i]=ch;
|
||||
ret_i++;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define INDEX "Thing="
|
||||
|
||||
int getThingName(){
|
||||
char *input = getenv("QUERY_STRING");
|
||||
if(input == NULL || input[0] == '\0'){
|
||||
ThingName = "";
|
||||
}else{
|
||||
input = (char*)strstr(input,INDEX);
|
||||
if(input == NULL || input[0] == '\0'){
|
||||
ThingName = "";
|
||||
}else{
|
||||
ThingName = input + strlen(INDEX);
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
int writeContentType(){
|
||||
puts("Content-type: text/html\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
int writeHeader(char* thing){
|
||||
puts("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">");
|
||||
puts("<html lang=\"ja\"><head>");
|
||||
puts("<link rev=\"made\" href=\"http://ledyba.ddo.jp/\">");
|
||||
puts("<meta http-equiv=\"Content-Script-Type\" content=\"text/javascript\">");
|
||||
puts("<meta http-equiv=\"Content-Style-Type\" content=\"text/css\">");
|
||||
puts("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\">");
|
||||
puts("<title>「成分解析」 for CGI written in C");
|
||||
if(thing != NULL && thing[0] != '\0'){
|
||||
printf(":%sの解析結果",thing);
|
||||
}
|
||||
puts("</title></head><body>");
|
||||
return 0;
|
||||
}
|
||||
int writeFooter(){
|
||||
puts("<hr>");
|
||||
puts("<p>");
|
||||
puts("Analyzed and written by <a href=\"http://ledyba.ddo.jp/\">ψ(プサイ)</a><br>");
|
||||
puts("Original program was written by <a href=\"http://www.tekipaki.jp/~clock/\">Clock</a><br>");
|
||||
puts("(2007/10/19)XSSに使えそうな脆弱性を修正。悪用されなくって良かった。<br>");
|
||||
puts("ついでにHTML 4.01 Strictに完全準拠。やったね!");
|
||||
puts("</p>");
|
||||
puts("</body></html>");
|
||||
return 0;
|
||||
}
|
||||
|
||||
int writeTitle(){
|
||||
puts("<h1>「成分解析」 for CGI written in C</h1>");
|
||||
puts("<hr>");
|
||||
puts("<p>流行だった成分解析を,<a href=\"http://ledyba.ddo.jp/2006/03/28034103.php\">解析して</a>CのCGIに移植しました.</p>");
|
||||
puts("<p> <a href=\"http://www.tekipaki.jp/~clock/\">本家</a>や<a href=\"http://ledyba.ddo.jp/2006/04/04015951.php\">Java版</a>と同じ結果が返ります.</p>");
|
||||
puts("<hr>");
|
||||
return 0;
|
||||
}
|
||||
|
||||
int writeForm(char* thing){
|
||||
if(thing == NULL) thing = "";
|
||||
printf("<form method=\"GET\" action=\"%s\">\n",getenv("SCRIPT_NAME"));
|
||||
puts("<p>");
|
||||
printf("<input type=\"text\" name=\"Thing\" value=\"%s\" tabindex=\"1\" accesskey=\"1\">\n",thing);
|
||||
puts("<input type=\"submit\" value=\"解析する\" tabindex=\"2\" accesskey=\"2\">");
|
||||
puts("<input type=\"reset\" value=\"取消\" tabindex=\"3\" accesskey=\"3\">");
|
||||
puts("</p>");
|
||||
puts("</form>");
|
||||
puts("<hr>");
|
||||
return 0;
|
||||
}
|
||||
|
||||
int doAnalyze(char* thing){
|
||||
unsigned int left = 100;
|
||||
unsigned int kind = 0;
|
||||
unsigned int per = 0;
|
||||
int i;
|
||||
int same;
|
||||
if(thing == NULL || thing[0] == '\0') return 0;
|
||||
RndSeed = getCode(thing);
|
||||
while(left > 0){
|
||||
kind = myRand() % 100;
|
||||
same = 0;
|
||||
for(i=0;i<EltCount;i++){
|
||||
if(Elt[i].kind == kind)same |= 1;
|
||||
}
|
||||
if(same) continue;
|
||||
per = (myRand() % left) + 1;
|
||||
Elt[EltCount].kind = kind;
|
||||
Elt[EltCount].per = per;
|
||||
left -= per;
|
||||
EltCount++;
|
||||
}
|
||||
sort();
|
||||
return 1;
|
||||
}
|
||||
|
||||
int getCode(char* str){
|
||||
int i=0;
|
||||
unsigned int code = 0;
|
||||
for(;i<strlen(str);i++){
|
||||
code += (((int)str[i]) & 0xff) << ((i & 0x3)<<0x3);
|
||||
// printf("%x ",str[i]);
|
||||
}
|
||||
return code;
|
||||
}
|
||||
|
||||
int myRand(){
|
||||
unsigned int result = 0;
|
||||
RndSeed *= 214013;
|
||||
RndSeed += 2531011; // ->次に呼び出されたときのseedに使う
|
||||
result = RndSeed;
|
||||
result = result >> 0x10;
|
||||
result &= 0x7fff;
|
||||
return (unsigned int)result;
|
||||
}
|
||||
|
||||
int sort(){
|
||||
int i,j;
|
||||
int prev;
|
||||
struct Element temp;
|
||||
for (i = EltCount - 1; i > 0; i--) {
|
||||
prev = 0;
|
||||
for (j = 1; j <= i; j++) {
|
||||
if (!(Elt[prev].per <= Elt[j].per)) {
|
||||
prev = j;
|
||||
}
|
||||
}
|
||||
//swap(elt, i, prev);
|
||||
/*スワップ*/
|
||||
temp = Elt[i];
|
||||
Elt[i] = Elt[prev];
|
||||
Elt[prev]=temp;
|
||||
}
|
||||
}
|
||||
|
||||
int writeCounter(){
|
||||
puts("<script type=\"text/javascript\">");
|
||||
puts("var gaJsHost = ((\"https:\" == document.location.protocol) ? \"https://ssl.\" : \"http://www.\");");
|
||||
puts("document.write(unescape(\"%3Cscript src='\" + gaJsHost + \"google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E\"));");
|
||||
puts("</script>");
|
||||
puts("<script type=\"text/javascript\">");
|
||||
puts("var pageTracker = _gat._getTracker(\"UA-4766333-1\");");
|
||||
puts("pageTracker._initData();");
|
||||
puts("pageTracker._trackPageview();");
|
||||
puts("</script>");
|
||||
}
|
||||
|
||||
int writeResult(char* thing){
|
||||
int i;
|
||||
int before = 0;
|
||||
printf("%sの成分解析結果 : <br>\n<br>\n",thing);
|
||||
for(i = 0;i<EltCount;i++){
|
||||
switch(Elt[i].per){
|
||||
case 50:
|
||||
if(!before){
|
||||
printf("%sの半分は%sで出来ています。<br>\n",thing,Kinds[Elt[i].kind]);
|
||||
before |= 1;
|
||||
}else{
|
||||
printf("%sのもう半分は%sで出来ています。<br>\n",thing,Kinds[Elt[i].kind]);
|
||||
}
|
||||
break;
|
||||
case 100:
|
||||
printf("%sはすべて%sで出来ています。<br>\n",thing,Kinds[Elt[i].kind]);
|
||||
break;
|
||||
default:
|
||||
printf("%sの%d\%は%sで出来ています。<br>\n",thing,Elt[i].per,Kinds[Elt[i].kind]);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
int writeError(){
|
||||
puts("物質名称を入力してください。");
|
||||
return 0;
|
||||
}
|
||||
|
||||
int decode(char* s,int len){
|
||||
int i,j;
|
||||
char buf,*s1;
|
||||
if(len==0)return(-1);
|
||||
s1=(char*)malloc(len);
|
||||
for(i=0,j=0;i<len;i++,j++)
|
||||
{
|
||||
if(s[i]=='+'){s1[j]=' ';continue;}
|
||||
if(s[i]!='%') {s1[j]=s[i];continue;}
|
||||
buf=((s[++i]>='A') ? s[i]-'A'+10 : s[i]-'0');
|
||||
buf*=16;
|
||||
buf+=((s[++i]>='A') ? s[i]-'A'+10 : s[i]-'0');
|
||||
s1[j]=buf;
|
||||
}
|
||||
for(i=0;i<j;i++) s[i]=s1[i];
|
||||
s[i]='\0';
|
||||
free(s1);
|
||||
return(0);
|
||||
}
|
||||
|
||||
int writeAd(){
|
||||
puts("<script type=\"text/javascript\"><!--");
|
||||
puts("google_ad_client = \"pub-3121031347596821\";");
|
||||
puts("google_ad_slot = \"5134098739\";");
|
||||
puts("google_ad_width = 234;");
|
||||
puts("google_ad_height = 60;");
|
||||
puts("//--></script>");
|
||||
puts("<script type=\"text/javascript\" src=\"http://pagead2.googlesyndication.com/pagead/show_ads.js\"></script>");
|
||||
return 0;
|
||||
}
|
93
c_cgi/Makefile
Normal file
93
c_cgi/Makefile
Normal file
|
@ -0,0 +1,93 @@
|
|||
# Makefile ( n source file 1 execute file version )
|
||||
# 2002/12/ 4
|
||||
|
||||
# 日本語のコメント部分に従って修正して下さい。
|
||||
# $(HOGEHOGE) というのはマクロ(一種の変数)で、
|
||||
# HOGEHOGE=... で定義された内容に展開して解釈されます。
|
||||
# 行頭のタブには意味がありますので、スペースに変換しないで下さい。
|
||||
# できれば、最終的に日本語コメントは削除して下さい。
|
||||
|
||||
# ↓パッケージ名かつ実行ファイル名に書き換える
|
||||
PACKAGE = Buffalin
|
||||
# ↓ソースファイルを書き並べる
|
||||
SRCS = Buffalin.c
|
||||
# ↓ヘッダファイルを書き並べる
|
||||
HEADS =
|
||||
OBJS = $(SRCS:.c=.o)
|
||||
|
||||
# ↓パッケージに含めるファイル名を書き並べる
|
||||
FILES = Makefile $(HEADS) $(SRCS)
|
||||
VER = `date +%Y%m%d`
|
||||
|
||||
|
||||
### command and flags ###
|
||||
# uncomment when debugging
|
||||
#DEBUG = -ggdb -pg # -lefence
|
||||
RELEASE = -s
|
||||
|
||||
# common (*.o)
|
||||
LD = gcc
|
||||
LDFLAGS = -g $(DEBUG) $(RELEASE)
|
||||
LDLIBS = -lm
|
||||
|
||||
# C (*.c)
|
||||
CC = gcc
|
||||
CFLAGS = -g -O3 -Wall $(DEBUG) $(RELEASE)
|
||||
CPPFLAGS= -I.
|
||||
|
||||
# etc
|
||||
SHELL = /bin/sh
|
||||
RM = rm -f
|
||||
PROF = gprof
|
||||
|
||||
|
||||
### rules ###
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .o .c .cc .f .p
|
||||
|
||||
all: $(PACKAGE).cgi
|
||||
|
||||
$(PACKAGE).cgi: $(OBJS)
|
||||
$(LD) $(LDFLAGS) $(OBJS) -o $@ $(LDLIBS)
|
||||
|
||||
$(OBJS): $(HEADS) Makefile
|
||||
|
||||
.c.o:
|
||||
$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@
|
||||
.cc.o:
|
||||
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $< -o $@
|
||||
.f.o:
|
||||
$(FC) $(FFLAGS) -c $< -o $@
|
||||
.p.o:
|
||||
$(PC) $(PFLAGS) $(CPPFLAGS) -c $< -o $@
|
||||
|
||||
$(PACKAGE)_res.o: $(PACKAGE).rc
|
||||
windres -i $(PACKAGE).rc -o $(PACKAGE)_res.o
|
||||
|
||||
### useful commands ###
|
||||
|
||||
clean:
|
||||
$(RM) $(PACKAGE) $(OBJS)
|
||||
$(RM) core gmon.out *~ #*#
|
||||
|
||||
tar:
|
||||
@echo $(PACKAGE)-$(VER) > .package
|
||||
@$(RM) -r `cat .package`
|
||||
@mkdir `cat .package`
|
||||
@ln $(FILES) `cat .package`
|
||||
tar cvf - `cat .package` | gzip -9 > `cat .package`.tar.gz
|
||||
@$(RM) -r `cat .package` .package
|
||||
|
||||
zip:
|
||||
zip -9 $(PACKAGE)-$(VER).zip $(FILES)
|
||||
|
||||
|
||||
prof: run
|
||||
$(PROF) $(PACKAGE) | less
|
||||
|
||||
run: all
|
||||
# ↓サンプルデータで実行するように書き直す
|
||||
# $(PACKAGE) は実行ファイル名に展開される
|
||||
# 行頭はタブ(スペースではない)
|
||||
./$(PACKAGE) < sample-data | less
|
1
c_cgi/install.sh
Normal file
1
c_cgi/install.sh
Normal file
|
@ -0,0 +1 @@
|
|||
cp Buffalin.cgi /mnt/www/ledyba/cgi/
|
22
java_applets/Package/BuffalinForJava.html
Normal file
22
java_applets/Package/BuffalinForJava.html
Normal file
|
@ -0,0 +1,22 @@
|
|||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
|
||||
<title>
|
||||
成分解析
|
||||
</title>
|
||||
</head>
|
||||
<body>
|
||||
analyzer.Analyzer は Java が使用できるブラウザで下に表示されます<br>
|
||||
<applet
|
||||
archive = "BuffalinForJava.jar"
|
||||
code = "analyzer.Analyzer.class"
|
||||
name = "バファリン"
|
||||
width = "450"
|
||||
height = "300"
|
||||
hspace = "0"
|
||||
vspace = "0"
|
||||
align = "middle"
|
||||
>
|
||||
</applet>
|
||||
</body>
|
||||
</html>
|
BIN
java_applets/Package/BuffalinForJava.jar
Normal file
BIN
java_applets/Package/BuffalinForJava.jar
Normal file
Binary file not shown.
173
java_applets/src/analyzer/Analyzer.java
Normal file
173
java_applets/src/analyzer/Analyzer.java
Normal file
|
@ -0,0 +1,173 @@
|
|||
package analyzer;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import java.applet.*;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JTextField;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.JTextArea;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.*;
|
||||
|
||||
/**
|
||||
* <p>タイトル: 成分解析</p>
|
||||
*
|
||||
* <p>説明: 成分を解析します</p>
|
||||
*
|
||||
* <p>著作権: Copyright (c) 2006 PSI</p>
|
||||
*
|
||||
* <p>会社名: ψ(プサイ)の興味関心空間</p>
|
||||
*
|
||||
* @author 未入力
|
||||
* @version 1.0
|
||||
*/
|
||||
|
||||
|
||||
public class Analyzer extends Applet {
|
||||
boolean isStandalone = false;
|
||||
BorderLayout borderLayout1 = new BorderLayout();
|
||||
JPanel jPanel1 = new JPanel();
|
||||
BorderLayout borderLayout2 = new BorderLayout();
|
||||
GridBagLayout gridBagLayout1 = new GridBagLayout();
|
||||
JScrollPane jScrollPane1 = new JScrollPane();
|
||||
JTextArea ResultField = new JTextArea();
|
||||
JButton AnalyzeButton = new JButton();
|
||||
JTextField ThingField = new JTextField();
|
||||
JLabel jLabel1 = new JLabel();
|
||||
JPanel CopyRightPanel = new JPanel();
|
||||
JLabel CopyRightField = new JLabel();
|
||||
GridBagLayout gridBagLayout2 = new GridBagLayout();
|
||||
JLabel CopeRight2 = new JLabel();
|
||||
JTextField CopyRight3 = new JTextField();
|
||||
JLabel CopyRight4 = new JLabel();
|
||||
JLabel CopyRight5 = new JLabel();
|
||||
JTextField CopyRight6 = new JTextField();
|
||||
JLabel CopyRight1 = new JLabel();
|
||||
//パラメータ値の取得
|
||||
public String getParameter(String key, String def) {
|
||||
return isStandalone ? System.getProperty(key, def) :
|
||||
(getParameter(key) != null ? getParameter(key) : def);
|
||||
}
|
||||
|
||||
//アプレットの構築
|
||||
public Analyzer() {
|
||||
}
|
||||
|
||||
//アプレットの初期化
|
||||
public void init() {
|
||||
try {
|
||||
jbInit();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
//コンポーネントの初期化
|
||||
private void jbInit() throws Exception {
|
||||
this.setLayout(borderLayout2);
|
||||
jPanel1.setLayout(gridBagLayout1);
|
||||
ResultField.setEditable(false);
|
||||
ResultField.setText("");
|
||||
AnalyzeButton.setText("成分を解析する");
|
||||
AnalyzeButton.addActionListener(new
|
||||
Analyzer_AnalyzeButton_actionAdapter(this));
|
||||
jLabel1.setText("jLabel1");
|
||||
CopyRightField.setBorder(BorderFactory.createEtchedBorder());
|
||||
CopyRightField.setText(
|
||||
"「成分解析」for Java v1.03(2006/04/12)");
|
||||
CopyRightPanel.setLayout(gridBagLayout2);
|
||||
CopeRight2.setText("ψ(プサイ)の興味関心空間:");
|
||||
CopyRight3.setEditable(false);
|
||||
CopyRight3.setText("http://ledyba.ddo.jp/");
|
||||
CopyRight4.setText("Original Program was written by Clock");
|
||||
CopyRight5.setToolTipText("");
|
||||
CopyRight5.setText("★カドルコア世代☆:");
|
||||
CopyRight6.setEditable(false);
|
||||
CopyRight6.setText("http://tekipaki.jp/~clock/");
|
||||
CopyRight1.setText("Analyzed & Written by ψ(プサイ)");
|
||||
this.add(jPanel1, java.awt.BorderLayout.CENTER);
|
||||
jScrollPane1.getViewport().add(ResultField);
|
||||
jPanel1.add(jScrollPane1, new GridBagConstraints(0, 2, 3, 1, 1.0, 1.0
|
||||
, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
|
||||
new Insets(5, 5, 5, 5), 0, 0));
|
||||
jPanel1.add(AnalyzeButton, new GridBagConstraints(2, 0, 1, 2, 0.0, 0.0
|
||||
, GridBagConstraints.CENTER, GridBagConstraints.NONE,
|
||||
new Insets(5, 0, 0, 5), 0, 0));
|
||||
this.add(CopyRightPanel, java.awt.BorderLayout.SOUTH);
|
||||
jPanel1.add(ThingField, new GridBagConstraints(0, 1, 2, 1, 1.0, 0.0
|
||||
, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
|
||||
new Insets(5, 5, 0, 5), 0, 0));
|
||||
CopyRightPanel.add(CopyRight4,
|
||||
new GridBagConstraints(0, 3, 3, 1, 1.0, 0.0
|
||||
, GridBagConstraints.WEST,
|
||||
GridBagConstraints.BOTH,
|
||||
new Insets(0, 5, 0, 0), 0, 0));
|
||||
CopyRightPanel.add(CopyRight3,
|
||||
new GridBagConstraints(1, 2, 1, 1, 1.0, 0.0
|
||||
, GridBagConstraints.CENTER,
|
||||
GridBagConstraints.HORIZONTAL,
|
||||
new Insets(0, 0, 0, 5), 0, 0));
|
||||
CopyRightPanel.add(CopyRight6,
|
||||
new GridBagConstraints(1, 4, 1, 1, 1.0, 0.0
|
||||
, GridBagConstraints.CENTER,
|
||||
GridBagConstraints.BOTH,
|
||||
new Insets(0, 0, 5, 5), 0, 0));
|
||||
CopyRightPanel.add(CopeRight2,
|
||||
new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0
|
||||
, GridBagConstraints.WEST,
|
||||
GridBagConstraints.NONE,
|
||||
new Insets(0, 5, 0, 0), 0, 0));
|
||||
CopyRightPanel.add(CopyRight5,
|
||||
new GridBagConstraints(0, 4, 1, 1, 0.0, 0.0
|
||||
, GridBagConstraints.WEST,
|
||||
GridBagConstraints.NONE,
|
||||
new Insets(0, 5, 5, 0), 0, 0));
|
||||
CopyRightPanel.add(CopyRight1, new GridBagConstraints(0, 1, 2, 1, 0.0, 0.0
|
||||
, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
|
||||
new Insets(0, 5, 0, 5), 0, 0)); /*マウス*/
|
||||
CopyRightPanel.add(CopyRightField,
|
||||
new GridBagConstraints(0, 0, 2, 1, 1.0, 0.0
|
||||
, GridBagConstraints.WEST,
|
||||
GridBagConstraints.BOTH,
|
||||
new Insets(0, 0, 0, 5), 0, 0));
|
||||
ResultField.addMouseListener(new psi.lib.Swing.PopupRightClick(ResultField));
|
||||
ThingField.addMouseListener(new psi.lib.Swing.PopupRightClick(ThingField));
|
||||
CopyRight3.addMouseListener(new psi.lib.Swing.PopupRightClick(CopyRight3));
|
||||
CopyRight6.addMouseListener(new psi.lib.Swing.PopupRightClick(CopyRight6));
|
||||
}
|
||||
|
||||
//アプレット情報の取得
|
||||
public String getAppletInfo() {
|
||||
return "アプレット情報";
|
||||
}
|
||||
|
||||
//パラメータ情報の取得
|
||||
public String[][] getParameterInfo() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public void AnalyzeButton_actionPerformed(ActionEvent e) {
|
||||
String str = this.ThingField.getText();
|
||||
if(str == null || str.equals("")){
|
||||
this.ResultField.setText("物質名称を入力してください。");
|
||||
return;
|
||||
}
|
||||
AnalyzerCore ana = new AnalyzerCore(str);
|
||||
this.ResultField.setText(ana.doAnalyze());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class Analyzer_AnalyzeButton_actionAdapter implements ActionListener {
|
||||
private Analyzer adaptee;
|
||||
Analyzer_AnalyzeButton_actionAdapter(Analyzer adaptee) {
|
||||
this.adaptee = adaptee;
|
||||
}
|
||||
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
|
||||
adaptee.AnalyzeButton_actionPerformed(e);
|
||||
}
|
||||
}
|
175
java_applets/src/analyzer/AnalyzerCore.java
Normal file
175
java_applets/src/analyzer/AnalyzerCore.java
Normal file
|
@ -0,0 +1,175 @@
|
|||
package analyzer;
|
||||
|
||||
import java.util.LinkedList;
|
||||
import java.util.Iterator;
|
||||
|
||||
/**
|
||||
* <p>タイトル: 成分解析</p>
|
||||
*
|
||||
* <p>説明: 成分を解析します</p>
|
||||
*
|
||||
* <p>著作権: Copyright (c) 2006 PSI</p>
|
||||
*
|
||||
* <p>会社名: ψ(プサイ)の興味関心空間</p>
|
||||
*
|
||||
* @author 未入力
|
||||
* @version 1.0
|
||||
*/
|
||||
public class AnalyzerCore {
|
||||
String Str;
|
||||
long seed = 0;
|
||||
|
||||
public AnalyzerCore(String str) {
|
||||
super();
|
||||
this.Str = str;
|
||||
}
|
||||
|
||||
public String doAnalyze() {
|
||||
byte[] ch = Str.getBytes();
|
||||
this.seed = this.getCode(ch);
|
||||
LinkedList list = new LinkedList();
|
||||
int left = 100;
|
||||
do {
|
||||
int Kind = (int) rnd() % 100;
|
||||
Iterator it = list.listIterator();
|
||||
boolean same = false;
|
||||
while (it.hasNext()) {
|
||||
/*同じのがあればもう一回試す*/
|
||||
if (((Element) it.next()).getKind() == Kind) {
|
||||
same |= true;
|
||||
}
|
||||
}
|
||||
if (same) {
|
||||
continue;
|
||||
}
|
||||
Element elt = new Element(Str, Kind,
|
||||
(int) (rnd() % left) + 1);
|
||||
left -= elt.getParcentage();
|
||||
list.add(elt);
|
||||
} while (left > 0);
|
||||
Object obj[] = list.toArray();
|
||||
Element[] comp = new Element[obj.length];
|
||||
for (int i = 0; i < comp.length; i++) {
|
||||
comp[i] = (Element) obj[i];
|
||||
}
|
||||
|
||||
selectionSort(comp, 0, comp.length);
|
||||
return getString(comp);
|
||||
}
|
||||
|
||||
public String getString(Element[] list) {
|
||||
String ret = "";
|
||||
boolean before = false;
|
||||
ret += this.Str + "の成分解析結果 : \n\n";
|
||||
for (int i = 0; i < list.length; i++) {
|
||||
ret += list[i].toString(before);
|
||||
if (list[i].getParcentage() == 50) {
|
||||
before = true;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
public void selectionSort(Element[] elt, int start, int end) {
|
||||
for (int i = end - 1; i > start; i--) {
|
||||
int prev = 0;
|
||||
for (int j = start + 1; j <= i; j++) {
|
||||
if (!(elt[prev].getParcentage() <= elt[j].getParcentage())) {
|
||||
prev = j;
|
||||
}
|
||||
}
|
||||
swap(elt, i, prev);
|
||||
}
|
||||
}
|
||||
|
||||
public void qsort(Element[] elt, int start, int length) {
|
||||
int end = start+length-1;
|
||||
do {
|
||||
if (!(length > 8)) {
|
||||
selectionSort(elt, start, length);
|
||||
} else {
|
||||
/*個数を2で割って入れ替え*/
|
||||
swap(elt, start, start + (length >> 1));
|
||||
int a;
|
||||
int b = start + length - 1;
|
||||
while (true) {
|
||||
b++;//なぜか足す
|
||||
//最初の要素からサーチ
|
||||
a = start;
|
||||
do {
|
||||
a++;
|
||||
}while(!(compare(elt[a], elt[start]) <= 0) && !(a > end));
|
||||
//最後の要素からサーチ
|
||||
do {
|
||||
b--;
|
||||
}while(!(compare(elt[b], elt[start]) >= 0) && !(b < start));
|
||||
|
||||
if(b < a){
|
||||
break;
|
||||
}else{
|
||||
swap(elt,a,b);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
swap(elt,start,b);
|
||||
if(!((b-start-1) < (end - a))){
|
||||
|
||||
}else{
|
||||
if(!(b > start + 1)){
|
||||
b--;
|
||||
if(!(a > end)){
|
||||
break;
|
||||
}else{
|
||||
start = a;
|
||||
continue;
|
||||
}
|
||||
}else{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
} while (true);
|
||||
|
||||
}
|
||||
|
||||
public int compare(Element a, Element b) {
|
||||
if (a.getParcentage() < b.getParcentage()) {
|
||||
return -1;
|
||||
} else if (a.getParcentage() < b.getParcentage()) {
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
public void swap(Element elt[], int target1, int target2) {
|
||||
Element tmp;
|
||||
tmp = elt[target2];
|
||||
elt[target2] = elt[target1];
|
||||
elt[target1] = tmp;
|
||||
}
|
||||
|
||||
public long getCode(byte[] ch) {
|
||||
long code = 0;
|
||||
for (int i = 0; i < ch.length; i++) {
|
||||
int add = psi.lib.CalTools.PokeTools.ByteToInt(ch[i]);
|
||||
code += add << ((i & 0x80000003) << 3);
|
||||
}
|
||||
code <<= 32;
|
||||
code >>= 32;
|
||||
// code &= 0xffffffff;
|
||||
return code;
|
||||
}
|
||||
|
||||
public long rnd() {
|
||||
this.seed *= 0x343FD;
|
||||
this.seed += 0x269EC3;
|
||||
this.seed = this.seed << 32;
|
||||
this.seed = this.seed >> 32;
|
||||
long seed = this.seed;
|
||||
seed = seed >> 0x10;
|
||||
seed &= 0x7fff;
|
||||
//System.out.println(Long.toHexString(seed));
|
||||
return seed;
|
||||
}
|
||||
}
|
60
java_applets/src/analyzer/Element.java
Normal file
60
java_applets/src/analyzer/Element.java
Normal file
|
@ -0,0 +1,60 @@
|
|||
package analyzer;
|
||||
|
||||
/**
|
||||
* <p>タイトル: 成分解析</p>
|
||||
*
|
||||
* <p>説明: 成分を解析します</p>
|
||||
*
|
||||
* <p>著作権: Copyright (c) 2006 PSI</p>
|
||||
*
|
||||
* <p>会社名: ψ(プサイ)の興味関心空間</p>
|
||||
*
|
||||
* @author 未入力
|
||||
* @version 1.0
|
||||
*/
|
||||
public class Element {
|
||||
private int Kind;
|
||||
private int Parcentage;
|
||||
String[] Kinds = {"下心", "微妙さ", "優雅さ", "華麗さ", "かわいさ", "やさしさ", "やましさ",
|
||||
"やらしさ", "むなしさ", "ツンデレ", "厳しさ", "世の無常さ", "ハッタリ", "ビタミン",
|
||||
"努力", "気合", "根性", "砂糖", "食塩", "愛", "電波", "毒電波", "元気玉",
|
||||
"怨念", "大阪のおいしい水", "明太子", "勇気", "運", "電力", "小麦粉",
|
||||
"汗と涙(化合物)", "覚悟", "大人の都合", "見栄", "欲望", "嘘", "真空", "呪詛",
|
||||
"信念", "夢", "記憶", "鉄の意志", "カルシウム", "魔法", "希望", "不思議",
|
||||
"勢い", "度胸", "乙女心", "罠", "花崗岩", "宇宙の意思", "犠牲", "毒物", "鉛",
|
||||
"海水", "蛇の抜け殻", "波動", "純金", "情報", "知識", "知恵", "魂の炎", "媚び",
|
||||
"保存料", "着色料", "税金", "歌", "苦労", "柳の樹皮", "睡眠薬", "スライム",
|
||||
"アルコール", "時間", "果物", "玉露", "利益", "赤い何か", "白い何か", "鍛錬",
|
||||
"月の光", "回路", "野望", "陰謀", "雪の結晶", "株", "黒インク", "白インク",
|
||||
"カテキン", "祝福", "気の迷い", "マイナスイオン", "濃硫酸", "ミスリル", "お菓子",
|
||||
"言葉", "心の壁", "成功の鍵", "理論", "血", };
|
||||
private String Thing;
|
||||
public Element(String thing,int Kind,int Parcentage) {
|
||||
super();
|
||||
this.Thing = thing;
|
||||
this.Kind = Kind;
|
||||
this.Parcentage = Parcentage;
|
||||
}
|
||||
|
||||
public int getKind() {
|
||||
return Kind;
|
||||
}
|
||||
|
||||
public int getParcentage() {
|
||||
return Parcentage;
|
||||
}
|
||||
public String toString(boolean before){
|
||||
switch(Parcentage){
|
||||
case 50:
|
||||
if(before){
|
||||
return Thing+"もう半分は"+this.Kinds[Kind]+"で出来ています。\n";
|
||||
}else{
|
||||
return Thing+"の半分は"+this.Kinds[Kind]+"で出来ています。\n";
|
||||
}
|
||||
case 100:
|
||||
return Thing+"はすべて"+this.Kinds[Kind]+"で出来ています。\n";
|
||||
default:
|
||||
return Thing+"の"+Parcentage+"%は"+this.Kinds[Kind]+"で出来ています。\n";
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue