将来は来るプログラミグ必修化に向けて個人塾やる話【週末起業】
昨日の夜酔った勢いで考えてたのが
来たるプログラミング必修化に向けてプログラミングの個人塾を開く案である。
もしかしたら、ほんまに将来やるかもしれんのでここに自分の現在の考えを書いておく。
ターゲットは、芦屋北側等の高級住宅街の近くで塾を開く
月謝1~1.5万円で10人集客すれば月10万円なので、お金はたまってきたが、あがらない給料に困ったらやってみるのアリかなって考え。
適当な自分の初期投資額として200~400万円
これほど触れ幅が大きいのは、PCは何使うか、広告代は自分で作成すればそんなかからんかな??って感じのノリだからである。
まぁ、こうゆうのこそクラウドソーシングでやりゃいい話。(いや、もしちゃんとやるならしっかり計算します。)
生徒は、紹介制にして紹介者と紹介された側がどちらもメリットありみたいな感じで増やす。
最初の顧客で塾に来る生徒の親がBtoCの営業系の人(保険の営業マンとか)ならばなおよい。
なぜなら、自分も個人塾に行っていた経験があるのだが
保険の営業の人の紹介でその塾に行くことが決まったからである。
餅は餅屋。やはり営業マンを味方に付ける事は双方にとっても都合がよい。
生徒が増えてきたら神大の情報系の学生を自身で研修して
週2で1回1.5時間の授業4000~5000円とかで求人出したらくるやろww
ってノリで生徒20人を持ってもらうと月謝20~30万(円/月)
人件費4000~5000(円/日)×2(日)×4(週) = 32,000~40,000(円/月)なので
まぁ、税金、人件費、維持費等で15万(円/月)ぐらいは残るかなぁ??
(こうゆうのは、素人なので計算がよくわからん)
ってノリで昨日頭の悪い脳で酔いながら考えたわけです。
他にも考えたのは、来たる東京オリンピックに向けて自動両替機の発明
空港とかに置いてもらえればおけ
Pythonすげえぇええ!!!【Python】【神戸大学】うりぼーねっとを用いて単位に関係する計算を行ってみた
題名の通りだが神戸大学教務情報システム「うりぼーねっと」を用いて
選択した単位のGP, 総単位数(total credit), GPAを計算するプログラムをPythonで書いてみた。
(一つだけ致命的な事で、うりぼーねっとの「単位数」という項目を用いて総単位数を計算しており、これにより修得単位数は一目でわかるようになるのだが、最後にGPAを計算する際に[GPA] = [GP] / [修得単位数]とのように計算を行っているので実際のGPAの計算式[GPA] = [GP] / [履修単位数]とは少し違った値が出てしまうが、うりぼーねっとの「単位数」のところに「履修単位数」ではなく「修得単位数」が表示されているのでこのプログラムはもう、そうゆう仕様のものとする。)
なぜ、このプログラムを実装しようとしたかというと
自分の所属している神戸大学情報知能工学科は
4回生にあがるときに研究室配属があるのだが全員が
自分の1番に希望している研究室に入れるわけではなく
専門科目のGP?(諸説あり)のように
何らかの成績から判断され優先権が決まるようなのだが
どうやら、専門科目が大きく研究室ポイント(自称)にかかわるらしい。
ちなみに、うりぼーねっとにも単位数とGPAは表示されているのだが
専門科目以外の成績も入っているために肝心の研究室ポイントがわからない。
そこで、情報知能工学科の学生は自分の研究室ポイントを計算すべく
計算をするかもしれないが、やはりそこは情知なので
機械に計算させるのがかっこいい!!
Man Powerじゃめんどくさいってのもあるけど
やっぱり、かっこいい!!ってので実装してみました。
ちなみに、Macでは動く事が確認されているので(自分周辺の機器のみw)
情知じゃない方もこの方法を使う事ができます。
結論:「ターミナル」があれば問題なし
実行方法は後に記述するとし、とりあえず件のプログラム
一度、「不可の後、もう一度単位を履修した」「取り消し」の処理が
うまくいってなかったのでそのプログラムを下に記す。
エラー内容としてはこうゆうエラーが出る。
gp.py:8: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
if list[8] == u"*":
gp.py:10: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
if list[8] == u"─":
〜改良前のプログラム〜
import sys #coding: UTF-8 f = open(sys.argv[1], 'r') gp = 0 num = 0 for row in f: list = row.split() if list[4] == u"*": continue if list[4] == u"─": continue num += float(list[4]) gp += float(list[8]) f.close() print "gp = %f" %(float(gp)) print "total credit = %f" %(float(num)) print "gpa = %f" %(float(gp/num))
最終的に正しいプログラム
〜performance.py〜
import sys #coding: UTF-8 f = open(sys.argv[1], 'r') gp = 0 num = 0 ex1 = str("*") ex2 = str("─") for row in f: list = row.split() if list[8] == ex1: continue if list[8] == ex2: continue num += float(list[4]) gp += float(list[8]) f.close() print "gp = %f" %(float(gp)) print "total credit = %f" %(float(num)) print "gpa = %f" %(float(gp/num))
〜専門科目のみの成績計算をするプログラム〜
gp_specific.py
import sys #coding: UTF-8 f = open(sys.argv[1], 'r') gp = 0 num = 0 ex1 = str("*") ex2 = str("─") sp = str("専門科目") for row in f: list = row.split() if list[8] == ex1: continue if list[8] == ex2: continue if list[1] != sp: continue num += float(list[4]) gp += float(list[8]) f.close() print "gp = %f" %(float(gp)) print "total credit = %f" %(float(num)) print "gpa = %f" %(float(gp/num))
上のエラーの取り除き方なのだが
こちらのブログを参考にさせていただいた
〜引用元〜
PythonのUnicodeEncodeErrorを知る - HDEラボ
解決法だけでなく原理まで知る事ができて非常に助かった。
以上がうりぼーねっとの成績表示から
必要な情報のみを抜き出して成績計算を行うプログラムである。
書いた後の感想「短い!!」「ひたすら短い!!」
Pythonさんすげえわwwコードが短すぎるw
これと同じ作業をjavaで書くと、俺なら60行は軽く使う気がするww
なんというか、プログラマの使用言語別年収ランキングで
Pythonが上位に食い込んでいる理由が理解できた
これだけコードを短くして実装ができると仕事が速い!!
仕事が速いと次の案件にもすぐ取りかかる事ができる!!
これからもPython使っていこう
他のプログラミング言語にも触れていこうと感じたいい機会だった。
実行方法
vimを用いて入力ファイルの生成(Macならいけるはず)
1.1 まず、うりぼーねっとで「単位修得状況紹介」のページを開く
そこで、計算したい教科を「NO」から「合否」までの部分を選択してコピーする。
(ここでの注意点は、選択をする際、最後に改行を入れない事である。もし、改行が入っているなら次の1.2での動作に一手間加える必要がある。)
1.2 実行ファイルのあるターミナル上で「vim performance.txt」を実行
(performance.txtは自分の好きな名前で良いがtxtファイル以外での動作が確認できていないので.txtは固定)
すると、vimが起動されて新しく先ほど指定した名前の(performance.txt)ファイルが生成され、何も書いていないファイルが開かれるはずである。
ターミナル上で「i」を押すと vimの insertモード(ファイル書き込みモード)に切り替わるので先ほどうりぼーねっとで選択してコピーした項目をペーストする。
(ここで、先ほどの1.1の作業で最後に改行を入れた人は最後の改行を消してから保存する)
1.3 vim performance.txtを保存する
はりつけが終了したら保存をおこなう。ターミナル上で「esc」キーをおしてから
「:wq」を押す。「:wq」はvimでファイルを保存する意味。
すると、ターミナルのいつもの画面に戻る。
2. pythonの実行
pythonはインタプリタ型の言語なのでコンパイルと実行が同時に行われる(その辺は、曖昧だがそういう解釈) ので
早速、ターミナル上で「python performance.py performance.txt」として実行
「performance.txt」はコマンドライン引数。
すると、実行結果(例)
seiya-no-MacBook-Pro:python seiya$ python gp.py gra7.txt
gp = 86.700000
total credit = 21.000000
gpa = 4.128571
こんな感じででる。
そろそろ始めよ
そろそろ、実際に今年の夏休みに作成しようとしていたものを作り始めようかと思う。
今のところの目標はWeb上のデータをファイルに格納する or Web上のデータをそのまま分析することである。
まず、javaで書いてみるが最終的に自分のiPhoneに入れたいので
swiftを使ってのプログラミングに修正する可能性があるため2倍の時間がかかることが見込まれる。
できるだけ気が向いた時にはガーッと早く書き進める事を念頭に置いておきたいと思う。
ここで、わかった事があるのだが読み込んだhtmlファイルから
必要な情報を取り出す作業をさせるのにrubyがむいている事がわかった
そのため、これからはrubyの勉強もしていきたいと思う。
そろそろリハビリ終了かなAOJ【0509】
今日は、リハビリも進んできたので正答率の低い問題を解く事にした
AOJ【0509】シート(シート | Aizu Online Judge)
javaを用いての実装をすることにしたがここで使用しようと考えたのがPolygonクラス。
ポリゴンといえばポケモンだが、こいつはまさにそれ。カクカクの多角形を表現するのにはこいつが最適。こんなクラスまで用意しとうとかjava最強かよww
しかし、実際に今回のプログラミングで使用したのは、配列だ。
また、頭悪い発見をした。仕組みについてであるが以下の考え方で記述する。
まぁ、俺の中でのjavaは便利で理解しやすいが故、誰でもできそうという烙印が押されてしまいそうな言語という認識なのでいつかは、javaからの脱却をしなければならない??のだろうか笑
さて、問題
〜考え方〜
1×1の正方形を以下のような配列でデータを格納し、各配列を正方形として処理、そしてセルの値が1ならばその領域はactiveであり、正方形がその領域に存在していると見なす。0であるならばその領域には正方形がないと考える。
この処理により、面積は瞬殺で出す事ができる。
面積?アクティブセルの数を数えるだけ。
まさに、瞬殺。
周の長さにおいても、一つの正方形につき4である。
しかし、4辺のうち他の正方形と接しているのでそのぶんを引かなくてはならないのだが
実は、これもある正方形の周の長さは、その対象としている正方形に
接している正方形の数だけ4から引いていけばよい。
[0][9] | [1][9] | [2][9] | [3][9] | [4][9] | [5][9] | [6][9] | [7][9] | [8][9] | [9][9] |
[0][8] | [1][8] | [2][8] | [3][8] | [4][8] | [5][8] | [6][8] | [7][8] | [8][8] | [9][8] |
[0][7] | [1][7] | [2][7] | [3][7] | [4][7] | [5][7] | [6][7] | [7][7] | [8][7] | [9][7] |
[0][6] | [1][6] | [2][6] | [3][6] | [4][6] | [5][6] | [6][6] | [7][6] | [8][6] | [9][6] |
[0][5] | [1][5] | [2][5] | [3][5] | [4][5] | [5][5] | [6][5] | [7][5] | [8][5] | [9][5] |
[0][4] | [1][4] | [2][4] | [3][4] | [4][4] | [5][4] | [6][4] | [7][4] | [8][4] | [9][4] |
[0][3] | [1][3] | [2][3] | [3][3] | [4][3] | [5][3] | [6][3] | [7][3] | [8][3] | [9][3] |
[0][2] | [1][2] | [2][2] | [3][2] | [4][2] | [5][2] | [6][2] | [7][2] | [8][2] | [9][2] |
[0][1] | [1][1] | [2][1] | [3][1] | [4][1] | [5][1] | [6][1] | [7][1] | [8][1] | [9][1] |
[0][0] | [1][0] | [2][0] | [3][0] | [4][0] | [5][0] | [6][0] | [7][0] | [8][0] | [9][0] |
正方形の実装のイメージ図
[0][9] | [1][9] | [2][9] | [3][9] | [4][9] | [5][9] | [6][9] | [7][9] | [8][9] | [9][9] |
[0][8] | [1][8] | [2][8] | [3][8] | [4][8] | [5][8] | [6][8] | [7][8] | [8][8] | [9][8] |
[0][7] | [1][7] | [2][7] | [3][7] | [4][7] | [5][7] | [6][7] | [7][7] | [8][7] | [9][7] |
[0][6] | [1][6] | [2][6] | [3][6] | [4][6] | [5][6] | [6][6] | [7][6] | [8][6] | [9][6] |
[0][5] | [1][5] | [2][5] | [3][5] | [4][5] | [5][5] | [6][5] | [7][5] | [8][5] | [9][5] |
[0][4] | [1][4] | [2][4] | [3][4] | [4][4] | [5][4] | [6][4] | [7][4] | [8][4] | [9][4] |
[0][3] | [1][3] | [2][3] | [3][3] | [4][3] | [5][3] | [6][3] | [7][3] | [8][3] | [9][3] |
[0][2] | [1][2] | [2][2] | [3][2] | [4][2] | [5][2] | [6][2] | [7][2] | [8][2] | [9][2] |
[0][1] | [1][1] | [2][1] | [3][1] | [4][1] | [5][1] | [6][1] | [7][1] | [8][1] | [9][1] |
[0][0] | [1][0] | [2][0] | [3][0] | [4][0] | [5][0] | [6][0] | [7][0] | [8][0] | [9][0] |
入力例1の図形の図
緑色はアクティブセル(正方形が存在する)って感じで正方形を表現する。
以下コード
~FileRead_0509.java~
package sheets_0509;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class FileRead_0509 {
private ArrayList<Integer> sl = new ArrayList<Integer>();
private int sq = new int[100][100][10];
/**
* @return the sq
*/
public int getSq() {
returnsq;
}
/**
* @return the sl
*/
public ArrayList<Integer> getSl() {
returnsl;
}
/**
* 配列の初期化のメソッド
*/
public void initSq(){
for(int l = 0; l < 10; l++){
for(int i = 0; i < 100; i++){
for(int k = 0; k < 100; k++){
sq[i][k][l] = 0;
}
}
}
}
public int FileRead(String filename){
FileReader fr = null;
BufferedReader br = null;
try {
fr = new FileReader(filename);
br = new BufferedReader(fr);
String line;
int i;
int count = 0;
while((line = br.readLine()) != null){ //1行読む
String word = line.split(" ", 0);
i = Integer.parseInt(word[0]); //数字に変換
sl.add(Integer.parseInt(word[1]));
if(i == 0) break; //EoFとしての0がきたらメソッド終了
for(int k = 0; k < i; k++){
line = br.readLine();
String w = line.split(" ", 0);
int m, n;
for(m = Integer.parseInt(w[0]); m < Integer.parseInt(w[2]); m++){
for(n = Integer.parseInt(w[1]); n < Integer.parseInt(w[3]); n++){
sq[m][n][count] = 1;
}
}
}
count++;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
returnsq;
}
}
~sheets.java~
package sheets_0509;
public class Sheets {
private static FileRead_0509 file = new FileRead_0509();
private static int sq = new int[100][100][10];
public int square(int i){
int s = 0;
for(int m = 0; m < 100; m++){
for(int n = 0; n < 100; n++){
if(sq[m][n][i] == 1){
s++;
}
}
}
returns;
}
public int length(int i){
int l = 0;
for(int m = 0; m < 100; m++){
for(int n = 0; n < 100; n++){
if(sq[m][n][i] == 1){
l += 4;
//周りにアクティブセルが存在するかの確認
/**
* 左端を見るとき
*/
if(m == 0){
if(n == 0){ //左下端のとき
if(sq[m+1][n][i] == 1)
l--;
if(sq[m][n+1][i] == 1)
l--;
continue;
}
if(n == 100-1){ //左上端のとき
if(sq[m+1][n][i] == 1)
l--;
if(sq[m][n+1][i] == 1)
l--;
continue;
}
if(sq[m+1][n][i] == 1)
l--;
if(sq[m][n+1][i] == 1)
l--;
if(sq[m][n-1][i] == 1)
l--;
continue;
}
/**
* 右端を見るとき
*/
if(m == 100-1){
if(n == 0){ //右下端のとき
if(sq[m-1][n][i] == 1)
l--;
if(sq[m][n+1][i] == 1)
l--;
continue;
}
if(n == 100-1){ //右上端のとき
if(sq[m-1][n][i] == 1)
l--;
if(sq[m][n-1][i] == 1)
l--;
continue;
}
if(sq[m-1][n][i] == 1)
l--;
if(sq[m][n+1][i] == 1)
l--;
if(sq[m][n-1][i] == 1)
l--;
continue;
}
/**
* 下端を見るとき
*/
if(n == 0){
if(sq[m-1][n][i] == 1)
l--;
if(sq[m+1][n][i] == 1)
l--;
if(sq[m][n+1][i] == 1)
l--;
continue;
}
/**
* 上端を見るとき
*/
if(n == 100-1){
if(sq[m-1][n][i] == 1)
l--;
if(sq[m][n+1][i] == 1)
l--;
if(sq[m][n-1][i] == 1)
l--;
continue;
}
/**
* 端以外を見るとき
*/
if(sq[m-1][n][i] == 1)
l--;
if(sq[m+1][n][i] == 1)
l--;
if(sq[m][n-1][i] == 1)
l--;
if(sq[m][n+1][i] == 1)
l--;
}
}
}
returnl;
}
public void showAnswer(){
for(int i = 0; i < file.getSl().size(); i++){
if(file.getSl().get(i) == 1){
System.out.println(square(i));
}
if(file.getSl().get(i) == 2){
System.out.println(square(i));
System.out.println(length(i));
}
}
}
public static void main(String args[]){
Sheets sheets = new Sheets();
file.FileRead(args[0]);
sq = file.getSq();
sheets.showAnswer();
}
}
最後の方が脳筋のゴリラプログラムになってしまったが
処理方法が他になさそうなのであまり気にしない事にする笑
円高時、高額ブランド商品を買うなら外国サイトで??
ふと、思いついたこと。
誰もがご存知の通りだが今、ポンド通貨に対して、円高であるので
ポールスミスの英国版通販サイトで
同じ商品を見たらいくらになるのだろうかと思って見てみた。
日本サイトで見た値段 9720円
英国サイトで見た値段 55ポンド 1ポンド=129.5円で計算して 7128円であった。
日本サイトで購入するよりも
2500円くらい安い笑
まぁ、実際はここに送料が追加されるので実際の値段はよくわからない笑笑
ちなみに、ユーロ圏でのサイトとアメリカでのサイトでも同じ商品を見たところ
ポールスミスの服
つまり、日本でうっている英国ブランドを英国で購入すると26%OFFになる。
(ポールスミスの服で計算した場合笑)
よって、送料が商品の値段の26%以下であった場合、日本で買うよりお得という事になる。
なんなら、英国ブランドの100万円の商品の購入(時計とか??)を考えている場合
浮いた26%の26万円分で買いに行くついでに旅行に行くこともできる。
まぁ、ここで問題になるのは商品の保証の話であるが
その辺は、自分がどうしたいかによるので本人依存で笑。
〜続々〜リハビリプログラムAOJ【0502】
またまた、リハビリプログラム
今回は、(サイコロ | Aizu Online Judge)
本日(記事をあげた時点では昨日)2つめのコードであるがやはり、リハビリを重ねるごとにコーディングのスピードがあがっているのを感じた。1日に解ける問題数がしっかりと増えてきているのはリハビリの効果が出始めているとみてとらえていいと感じる。
また、今年の夏休みは、5日に1度、直前の5日間を振り返って
今後どのようにしていくかを反省していきたいと考えている(受験生か!!)
ちなみに、この問題は
サイコロの上面をtop
サイコロの前面をfront
サイコロの右面をrs (right-sideとする)
この3面さえわかれば
下は7-top
後ろは7-front
左は7-rsとなるため
結果、6面が把握できる事になる。
(3面の情報を把握する事によりサイコロ全ての面の情報を把握する事が可能)
このデータ管理によりプログラミングの労力を減らす事ができる。
このとき、注意するのが次の3面の情報が前の情報に依存するため
データの代入中には、データを2つ用意する事が必要である。
次の各面の数字と、現在の各面の数字
ページを見ると各動作によるサイコロの挙動は明らかである。
以下に擬似コードを記す。
(次の各面の値) = (前の各面の値を用いて処理)
操作Northによって
top = front
front = 7-top
rs = rs (変わらない)
操作Eastによって
top = 7-rs
front = front(変わらない)
rs = top
操作Westによって
top = rs
front = front(変わらない)
rs = 7-top
操作Southによって
top = 7 - front
front = top
rs = rs (変わらない)
操作Rightによって
top = top
front = rs
rs = 7 - front
操作Leftによって
top = top
front = 7 - rs
rs = front
となる。が、実行結果はミスっていたため(擬似コードの挙動予測はあってると思う)
デバッグを行った。
~修正後のコード~
~FileRead_0502.java~
package dice_0502;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class FileRead_0502 {
ArrayList<String> direction = new ArrayList<String>();
/**
* @return the direction
*/
public ArrayList<String> getDirection() {
return direction;
}
public void fileRead(String filename){
FileReader fr = null;
BufferedReader br = null;
try {
fr = new FileReader(filename);
br = new BufferedReader(fr);
String line;
int i;
while*1 != null){ //1行読む
i = Integer.parseInt(line);
if(i == 0) break; //EoFの0がきたら終了
for(int k = 0; k < i; k++){
line = br.readLine();
direction.add(line);
if(k == i-1){
direction.add(null);
}
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
~Dice.java~
package dice_0502;
public class Dice {
private static FileRead_0502 file = new FileRead_0502();
private int top = 1, front = 2, rs = 3;
private int p_t = 1, p_f = 2, p_r = 3;
privateintpoint = 1;
public void lotation(){
for(int i = 0; i < file.getDirection().size(); i++){
if(file.getDirection().get(i) == null){
System.out.println(point);
point = 1;
top = 1; front = 2; rs = 3;
p_t = 1; p_f = 2; p_r = 3;
continue;
}
if(file.getDirection().get(i).equals("North")){
this.north();
}
if(file.getDirection().get(i).equals("East")){
this.east();
}
if(file.getDirection().get(i).equals("West")){
this.west();
}
if(file.getDirection().get(i).equals("South")){
this.south();
}
if(file.getDirection().get(i).equals("Right")){
this.right();
}
if(file.getDirection().get(i).equals("Left")){
this.left();
}
p_t = top;
p_f = front;
p_r = rs;
point += top;
}
}
public void north(){
top = p_f;
front = 7-p_t;
//rsは変更なし
}
public void east(){
top = 7-p_r;
//frontは変更なし
rs = p_t;
}
public void west(){
top = p_r;
//frontは変更なし
rs = 7-p_t;
}
public void south(){
top = 7-p_f;
front = p_t;
//rsは変更なし
}
public void right(){
//topは変更なし
front = p_r;
rs = 7-p_f;
}
public void left(){
//topは変更なし
front = 7-p_r;
rs = p_f;
}
public static void main(String args[]){
file.fileRead(args[0]);
Dice dice = new Dice();
dice.lotation();
}
}
ミスってたとこ…
・そもそもの一番最初の1が上の時を足し忘れていた。
・2回目のサイコロの回転の開始時に、サイコロの状態を初期化し忘れていた事。修正前は、前回のサイコロの回転の最後の状態から開始していた。
この2点を修正することによって、ちゃんとした実行結果を得られる事ができた。
*1:line = br.readLine(
〜続〜リハビリプログラムAOJ【0501】
またまた、AOJでリハビリプログラミング
今日は、前の問題の次の問題を解いている
そのため、前の問題と似ているところがあり
少しだけ、昨日のコードを流用させていただいた。
昨日とコードが少しかぶっているのと2日連続のコーディングにより
すこしずつ、コーディングにかかる時間が短縮されたように感じる。
これもまた、昨日のと同様に入力ファイルの指定はコマンドライン引数で指定している。
他の仕様に関しては、上にのせているページと同じ通りである。
入力例と出力例はページに載っている通りなのでここでは割愛。
~FileRead.java~
package dataConversion_0501;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class FileRead {
private ArrayList<String> before = new ArrayList<String>();
private ArrayList<String> after = new ArrayList<String>();
private ArrayList<String> input = new ArrayList<String>();
/**
* @return the before
*/
public ArrayList<String> getBefore() {
returnbefore;
}
/**
* @return the after
*/
public ArrayList<String> getAfter() {
returnafter;
}
/**
* @return the input
*/
public ArrayList<String> getInput() {
returninput;
}
public void fileRead(String filename){
FileReader fr = null;
BufferedReader br = null;
try {
fr = new FileReader(filename);
br = new BufferedReader(fr);
String line;
int i;
while*1 != null){ //1行読む
i = Integer.parseInt(line); //数字に変換
if(i == 0) break; //EoFとしての0がきたらメソッド終了
for(int k = 0; k < i; k++){
line = br.readLine();
String word = line.split(" ", 0);
before.add(word[0]);
after.add(word[1]);
if(k == i-1){
before.add(null);
after.add(null);
}
}
line = br.readLine();
i = Integer.parseInt(line);
for(int k = 0; k < i; k++){
line = br.readLine();
input.add(line);
//複数入力間において間のデータにnullを代入する。
if(k == i-1){
input.add(null);
}
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
~Conversion.java~
package dataConversion_0501;
public class Conversion {
private static FileRead file = new FileRead();
public void conversion(){
System.out.println(file.getBefore());
System.out.println(file.getAfter());
for(int i = 0; i < file.getInput().size(); i++){
//入力が次の入力に切り替わるとき
if(file.getInput().get(i) == null){
System.out.println(); //改行処理
while(file.getBefore().get(0) != null){
file.getBefore().remove(0);
file.getAfter().remove(0);
}
//nullも除去
file.getBefore().remove(0);
file.getAfter().remove(0);
continue;
}
//入力がまだあるとき
for(int k = 0; file.getBefore().get(k) != null; k++){
if(file.getBefore().get(k).equals(file.getInput().get(i))){
file.getInput().remove(i);
file.getInput().add(i, file.getAfter().get(k));
break;
}
}
System.out.print(file.getInput().get(i));
}
}
public static void main(String args){
file.fileRead(args[0]);
Conversion con = new Conversion();
con.conversion();
}
}
*1:line = br.readLine(
リハビリプログラムAOJ【0500】
50年ぶりぐらいにプログラミングするからまずは、リハビリからしよ!!ってことで
AOJの問題(カードゲーム | Aizu Online Judge)を解いていて
まぁ、解き始めはこんなん2時間あればかけるやろって感じだったが
最近、プログラミングに触れてなさ過ぎてほぼ完全に書き方忘れとったww
結局、間にハリーポッターを鑑賞する事をはさんで8時間ぐらいかかったwwwwwww
まぁ、なにはともあれかけたのでとりあえずのせる
これからは、たいしたコードではなくとものせていこうと思う。
(特に、ブログにのせれるネタがないということも一因であるww)
たいしたコードではないが自分のコードを客観的に見るために
いつものエクリプス上のコードとは違う雰囲気の中見ていこうと考えたからである。
ちなみに言語はjavaで書いた。
リハビリとしてはちょうどいい優しさだった
今日、残ってる時間と明日からもいろんなコードを書いていこう
プチ解説としては、ファイル名はコマンドライン引数で指定
その他の事に関しては、AOJの問題が要求している仕様である。
実行例は、上の問題のページの通りの挙動をしているが
わざわざのせるのがめんどくさいのでここでは割愛。
このコードを書いていて新しく学んだ事はBufferedReaderを用いて
入力ファイルを1行ずつ読み込んで処理できるという事を学んだ(それぐらい…笑)
という実際に得られた知識どうこう以前に自分が夏休み中にプログラミングをしているという事が
もうそれは、大きな成長なのでまぁまぁ、よいスタートだと思う。
この調子でいきたい
~FileRead.java~
package cardGame_0500;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
/**
* データの読み込みを行うクラス
* 読み込みファイル名 cardGameInput.docx
* @author seiya
*/
public class FileRead {
//配列要素数の限界は10000である(n≦10000)
private ArrayList<Integer> A = new ArrayList<Integer>();
private ArrayList<Integer> B = new ArrayList<Integer>();
/**
* @return the a
*/
public ArrayList<Integer> getA() {
returnA;
}
/**
* @return the b
*/
public ArrayList<Integer> getB() {
returnB;
}
/**
* 入力ファイルのデータを1行ずつ読み込みデータをセットするメソッド
*/
public void fileReadSet(String filename){
FileReader fr = null;
BufferedReader br = null;
try {
fr = new FileReader(filename);
br = new BufferedReader(fr);
String line;
int i;
while*1 != null){ //1行読む
i = Integer.parseInt(line); //数字に変換
if(i == 0) break; //EoFとしての0がきたらメソッド終了
for(int k = 0; k < i; k++){
line = br.readLine();
String word = line.split(" ", 0);
A.add(Integer.parseInt(word[0]));
B.add(Integer.parseInt(word[1]));
//複数ゲーム間において間のデータにnullを代入する。
if(k == i-1){
A.add(null);
B.add(null);
}
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return;
}
}
~Battle.java~
package cardGame_0500;
/**
* 実際にカードゲームを行い点数を競うプログラム
* @author seiya
*
*/
public class Battle {
//カードゲームの勝負の結果を格納する変数
private ArrayList<Integer> Ra = new ArrayList<Integer>();
private ArrayList<Integer> Rb = new ArrayList<Integer>();
private static FileRead file = new FileRead();
public void numComp(){
int Ap = 0, Bp = 0;
for(int i = 0; i < file.getA().size(); i++){
if(file.getA().get(i) == null){
Ra.add(Ap);
Rb.add(Bp);
Ap = 0;
Bp = 0;
continue;
}
if(file.getA().get(i) < file.getB().get(i)){
Bp += (file.getA().get(i)+file.getB().get(i));
}
if(file.getA().get(i) > file.getB().get(i)){
Ap += (file.getA().get(i)+file.getB().get(i));
}
if(file.getA().get(i) == file.getB().get(i)){
Ap += file.getA().get(i);
Bp += file.getB().get(i);
}
}
}
public void showResult(){
for(int i = 0; i < Ra.size(); i++){
System.out.println(Ra.get(i)+" "+Rb.get(i));
}
}
//コマンドライン引数にファイル名を代入
public static void main(String args){
Battle battle = new Battle();
file.fileReadSet(args[0]); //入力データの読み込み
battle.numComp();
battle.showResult();
}
}
*1:line = br.readLine(
なぜか、読者になっていなかったw
今年の夏休みの目標==為替レート自動売買システムの開発【もう一人の俺をつくる】
今年も夏休みが始まったが未だに大学院に進学するか就職するか迷っている。
自分の希望としては、大学院に残って研究をするよりもさっさと社会に出て実際に開発をしたい。まぁ、研究室配属されてから研究が楽しいとか言い出す可能性が大アリなんだが…w(99%そうなるww)
まぁ、就職に傾いた場合、理系就職したければ企業に開発物を見せる必要性があるので
最後の夏休みを迎えて、これからは、いろいろ開発を楽しんでいきたいと思う。
1.取引シグナル感知システム
最初から完全な自動売買システムを完成できるとは思っていないので
まず、取引のシグナルが感知されたらケータイに通知がいくように設計していきたいと考えている。
2.取引アルゴリズムの決定
基本的には、非常にプログラミングがしやすい5分足チャートのボリバン+MACDを使用してのトレードを行わせようと考えている。
必要であると予測される知識
・画像解析or数値処理
主に(ほぼ100%??)テクニカル分析を用いるためチャートの情報を解析する必要性が存在する。
・Webサイト上の数値や画像をプログラムで使用できるように取り込む
解析元データは、ネット上からとってこようと考えている。そのため、ネット上のデータをプログラムで使用できるように取り込まなければならない。その知識に関しても必要である。
・新しい言語の習得
今まで書いた事のあるプログラミング言語は、c言語、java、PHP、一瞬prologであったがシステムの都合上別の言語を習得する必要性が出てくる可能性がある。
その場合は、頑張るしかないな笑
最近は、テストとかあってプログラミング自体が久々なのでAOJとかで勘を取り戻す事にした。あと、これからは自分が書いたプログラムは、些細なものでも適当にここにのせていこうかなと考えている。
本来なら、もう少し丁寧にこの記事を書いていたのだが書いている途中でページを間違えて閉じてしまい半分ぐらい書いてる内容を忘れてしまったので適当なのは仕方ない。
2016/08/11時点での目標
進捗、変更があれば追記しよ。
テスト前日熱発症。オワタww??
テスト前日にあろうことか熱を出してしまったwww
だが、意外とこうゆう時ほど焦るもので
20時まではスヤスヤしてたがそっからは
丸薬も飲んだのでまぁまぁはかどっておる
しゃあなし頑張るでなww
英国国民投票EU離脱FX取引レポート【2016/06/23】投票発表【2016/06/24】
土日も終わりかなりおくれてしまったが、金曜日のトレードのレポートを書いていきたいと思う
経済史の中でも歴史に残りそうなこのビッグイベント取引しない手はなかったので初心者ながら参戦させていただいた。(取引自体は半年間しているが、普段の元手は株で30万FXは1000円であるのに対し、今回は株の資金30万円をFXの口座に移して挑ませていただいた。実際は1万単位での取引がメインであったので30万を使った局面はなかったが。)
まず、総合結果からいわせていただくと、57戦28勝29敗で61,171円の利益となった。
学生という身分ながらかなり稼がせていただいたが
これを特にパーっと使うでもなくこのままこの勢いで年収103万を超えてやるか〜とか考えだしたり
株の軍資金の足しにでもするか〜と考えるあたりが俺。未だにこの利益を株以外に使う予定はありませんww
最終的に6時間トレードを行った訳だが、ここまで長時間トレードをするのは初めてであったので
取引時間が4時間を超えた当たりから集中力が切れたのか、最後の2時間は全敗で6万円の損失を被った。(最後の2時間のトレード9戦9敗ww)
一番重要な敗因としては、そこまでは、1万単位での取引であったが何を考えたか急に2万単位での取引をはじめた。かつ、普段は絶対に行わないナンピン取引を行ったためいつものシステムトレードの形に落とし込むことができず、最終的に売買の大幅スプレッド、急騰、急落のスリッページの嵐の取引の中に巻き込まれ、損失が大きくなってしまったところで損切りをしたのが原因であると考えられる。(間違いなく12万を稼いだ瞬間に調子に乗ってしまったことで、普段のルールを破った事が原因だ。)今度からのトレードは完全にルールを守ってトレードをする事を今まで以上に徹底していきたい。
ここで、今回のトレードの手法であるが投票結果と世論調査により1~5円の急騰、急落が発生しうるため、いつもしているテクニカルトレードに新たなルールを加えたトレード法を用いてトレードする事となった。その手法であるが、6/23日に考案した「地震トレード(自称)」をシステマティックな形式に落とし込めて、トレードを行った。
英EU離脱リスク回避による日経平均反落
ローソク足を見ると買いと売りの拮抗であるが
終値よりは低い状態
日本時間、金曜日15時に「離脱」「残留」の最終発表であるがその前から為替相場は動くはずである
投票結果は地域ごとに分割して発表されていくので
GBP/JPYチャートの形を見ればどちらが優勢かわかる
今回のイベントに際しての自分の作戦は
1分足はトレード用のチャートで使用
30分足はトレンド読み取り用として使用
今のチャート(水曜日15時ほど)を見ればわかるが
30分足で見た際横ばいである。
これがどのように動いていくかを確認して
トレードのタイミングと売りか買いを判断する。
大まかな流れとしては
為替が下落⇒離脱が優勢
為替が上昇(横ばい)⇒残留が優勢
離脱が優勢⇒
大幅な円高、ポンド安予想としFXで空売り
残留が優勢⇒
株式相場の負の懸念が解消⇒株で買い
という作戦でいこうと考えている。
具体的な作戦としては木曜日の15時までに考えることとする。