散弾銃

仕事の不満を書いて忘れ休日の思い出を書き残すブログ

本の感想

最近フリーランスにちょっと興味を持っています。動機は、かっこよく言うと単価や仕事の有無が自身の腕一本にかかっててわかりやすいからです。愚痴っぽく言うと、会社に所属しないことで自身の責任範囲を自分の報酬分の仕事に限定することが出来るからです。できない人のアシストもうしたくない。

 それに向けて最近本を少しずつ読むようになりました。手始めに「フリーランスを代表して 申告と節税について教わってきました。」という本を読んだので感想です。

 内容は、フリーランスで働いている著者が、確定申告をするにあたって知っておきたい税金等の知識について、税理士との会話形式で教わっていくというものです。個人的に会話形式は好きじゃないのですが、この本の登場人物はクセがなく楽しく読み進められました。会話形式なので内容はかなりわかりやすくまとまっており、「年金」「健康保険」「減価償却」「白色申告/青色申告」など、耳にしたことはあるけどあまりちゃんと知らない言葉たちがドンドン理解出来たのがとても良かったです。僅か200ページ強で、確定申告とは何なのか?行うにあたって意識すること、損しない方法はあるのか?節税とはどのように行うものなのか?など、確定申告をしたことがない人間が気になるポイントに一通り触れてくれており、「確定申告」という言葉のハードルがかなり下げてくれるので、フリーランスで働くことを目指す人にとっては心強い本だと思います。

 ちなみに初版が発売されたのは2005年で、それから法制度等が変わるにつれ内容の更新があるようなので、もし読む方は最新版を買うことをお勧めします。

私がこの本の内容を実践するときにはもっと新しい版が出てる気がします…。

CodeIQのCランク問題に挑戦

プログラミングの実力を判定しましょうってバナー広告に釣られて

久々のコーディングに挑戦してみました。

 

【問題】

「0123456789」の10枚のカードの内、4枚のカードが提示されます。

通常は、「最も数値が大きなカード」が勝利者のカードです。
4枚の中に0があれば、「0以外で最も小さなカード」が勝利者のカードです。

勝利者のカードの数値を割り出してください。

 

以下、15分ぐらいで書いたソースコード

 

import java.util.Scanner;

public class main {

public static void main(String args) {


Scanner scan = new Scanner(System.in);
String num = scan.next();
int max = -1;
int min = 10;
boolean flg = false;
String num2 = num.split("",0);

for(int i = 0;i<4;i++){
int num3;

num3 = Integer.parseInt(num2[i]);
if(num3 == 0){
flg = true;
}
if(max<num3){
max = num3;
}
if(min>num3 && num3 != 0){
min = num3;
}


}

if(flg){
System.out.println(min);
} else {

System.out.println(max);
}

}

}

 

出来てないこと:

①文字列の入力も受け付けてしまう

②入力できる文字数に制限がない(問題だと4ケタ)

③複数行の処理に対応していない

 

解決方法:

①、②:正規表現で受け付ける文字の種類、数に制限をかける

③文字入力をwhile文で回し、4文字の入力を複数回受け付けられるようにする

 

疑問点:

文字列の入力の終了タイミングをどう判定するか(0と一文字入力したら終了、とかで良いのだろうか)

 

正規表現とかほぼ覚えてないけど15分ぐらいで直せないだろうか。

 

 

6/24追記

完成しました。

6/24追記②

赤字の箇所を修正(同じ文字を複数回入力出来ないようにしました)

 

>|java|
import java.util.ArrayList;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class main {

public static void main(String[] args) {




boolean flg = false;
boolean flgZero = false;
boolean flgInput = true;
ArrayList<String> input = new ArrayList<String>();

while(flgInput){
Scanner scan = new Scanner(System.in);
String num = scan.next();
Pattern p = Pattern.compile("^\\d{4}$");
Matcher m = p.matcher(num);
String[] inputInt = num.split("",0);


if(m.find()){
for(int i = 0;i<4;i++){
for(int n = 0;n<4;n++){
if(inputInt[i].equals(inputInt[n]) && i!=n){
flg = true;
}
}
}
if(flg){
System.out.println("重複しない数字を入力して下さい。");
flg = false;
} else{
input.add(num);
}
} else if(num.equals("0")){

flgInput = false;
}else{
System.out.println("入力出来る文字は4ケタの半角数字のみです。");
}

}

for(String s:input){
int max = -1;
int min = 10;
String[] inputSplit = s.split("",0);

for(int i = 0;i<4;i++){
int num3;
num3 = Integer.parseInt(inputSplit[i]);

if(num3 == 0){
flgZero = true;
}
if(max<num3){
max = num3;
}
if(min>num3 && num3 != 0){
min = num3;
}

}
if(flgZero){
System.out.println(min);
} else {

System.out.println(max);

}

}


}

}





||<

 

インデントが消滅して見づらいけど、

①正規表現による文字の属性・桁数チェック

②複数行の入力への対応

 

が出来ました。

入力受付は0と打ったら終了します。指定されてないしいいでしょ。

 

以上

 

串カツ食べ比べ@大阪

GW中、2泊3日で大阪を旅行した。

 

夜中に店が開いていることもあり、たくさん食べ歩きをした中でも一番多く食べた串カツについてメモ。

 

・基本的に注文から10分前後で出てくる

・ソースは甘め。

 

①八銭(なんば)

今回の4店の中で牛が一番美味かった。圧倒的。

料理が出てくるのが一番遅かった(30分ぐらいかかった)。

 

②じゃんじゃん(心斎橋)

チェーン店にも関わらず豚バラ・ソースが一番美味かった。

俺の中で総合一位。

 

③鶴亀屋(新世界)

24時間営業。若き日の明石屋さんまさんのポスターが出迎えてくれる。

突出した美味さはなかったが、バナナ、アボカドなど変わり種が多く楽しめる。

 

④だるま(梅田)

元祖串カツ店。最大の特徴は衣がとても細かいことで、ここだけ他の店とベクトルが違う。

ソースが良く絡むが、具材は小さめ。

服を選ぶときに気を付けていること①:色編

僕が普段服を選ぶときに意識していることを書きます。

読んでいる方のご参考になれば。。

先に書いてあるものほどとっつきやすいと思います。

 

①季節感を取り入れる

春~夏は爽やかな色を、秋~冬は落ち着いた色を取り入れると季節感が出ます。

例えば同じ赤系の色を使う場合でも

春~夏:淡いピンク

秋~冬:ワインレッド

 

と色の明るさを変えるだけで見た目の印象が大きく変わります。

春夏は淡い色、秋冬は濃い色を使うのが鉄板です。

 

②色をリンクさせる

急に小技的な話になるのですが、小物や服の色を揃えておくと統一感が出てオシャレに見えます。

よくあるのが

・靴と鞄を同じ色で揃える

・トップスと靴を同じ色で揃える

・帽子と襟から出たシャツの色を揃える

などなど、、

 

ちなみに僕は腕時計が黒なので、黒の鞄や靴を多めにストックしています。

 

③さし色を使う

全体的に似たような色味の服を選んでしまうとボヤっとした印象になってしまいますが、どこか一か所、目立つ色を少しだけ入れてあげると(全体の1割ぐらい)、メリハリがつき引き締まったコーディネートになります。

さし色の選び方は様々ですが、慣れていない方は白が一番取り入れやすいと思います。

靴、ソックス、ロングシャツなどを駆使し、メリハリを意識してみましょう。

 

 

と、ここまで小賢しいテクニックをつらつら書きましたが、一番勉強になるのはおしゃれな人の服を見ることだと思います。

気に入ったコーデはガンガン真似し、思いついたことはどんどん実践することで、自然と配色バランスの感覚が身に付くはずことでしょう。。

皆さんも素敵なファッションライフを満喫して下さい。

 

ponkotuse

【身内用】コード&関数全文

■適用方法

①開発タブを表示させる

 Excelを開き、ファイル→オプション→リボンのユーザ設定→「開発」にチェックを入れOK

 

②シート作成

 以下の画像を参考に、「本体」「条件表」シートを作成する(シート名は変えないで下さい)

 ※数式の内容

 本体シート

  ・K2:=IF(L2=1,"○","×")

  ・L2:=$B2&$C2&$D2&$E2&$F2

  ・M2:=条件表!$G2

  ・N2:=COUNTIF($J$2:$J$201,$I2)

f:id:ponkotuse:20170306230433p:plain

 

 条件表シート

  ・H2:=$B2&$C2&$D2&$E2&$F2

f:id:ponkotuse:20170306230458p:plain

 

f:id:ponkotuse:20170306230458p:plain

 

③Alt+F8でマクロの洗濯画面を表示後、適当な名前を入力して作成をクリック。

f:id:ponkotuse:20170306230820p:plain

表示された画面に以下のソースをコピペする。

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Option Explicit
Sub 判定()

Dim i As Integer
i = 1


Do Until ActiveSheet.Cells(i, 6).Value = ""



i = i + 1

Loop

Range("K2").Copy
ActiveSheet.Paste Destination:=Range("G2:G" & i - 1)

End Sub
Sub データ連結()

Dim i As Integer
i = 1

Do Until ActiveSheet.Cells(i, 6).Value = ""



i = i + 1

Loop

Range("L2").Copy
ActiveSheet.Paste Destination:=Range("I2:I" & i - 1)

End Sub

Sub 条件表データ連結()

Dim i As Integer
i = 1


Worksheets("条件表").Select
Do Until ActiveSheet.Cells(i, 6).Value = ""



i = i + 1

Loop

Worksheets("本体").Select
Range("J2").Select

Range("M2").Copy
ActiveSheet.Paste Destination:=Range("J2:J" & i - 1)

ActiveCell.Offset(1, 0).Activate

Range("N2").Value = "=COUNTIF($J$2:$J$" & i & ",$I2)"

 

End Sub

Sub データ検索()

Dim i As Integer
i = 1


Do Until ActiveSheet.Cells(i, 6).Value = ""



i = i + 1

Loop
Range("N2").Copy
Dim myArray
myArray = Range("H2,H" & i)

ActiveSheet.Paste Destination:=Range("H2:H" & i - 1)

End Sub
Sub 自動判定()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

Dim start, finish As Variant

start = Time

Application.Run "データ連結"
Application.Run "条件表データ連結"
Application.Run "データ検索"
Application.Run "判定"

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

finish = Time
MsgBox "取得が完了しました" & vbLf & "実行時間は" & Format(finish - start, "nn分ss秒") & "でした"
End Sub

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

f:id:ponkotuse:20170306231010p:plain

 

④マクロの実行ボタンを作成

開発タブ→挿入→ボタン(左上にあります)を選択。

マクロの登録ウィンドウが出るので、自動判定を選択

ボタンを適当な位置に移動し(K列より右が良い)、シート完成。

 

⑤ブックを拡張子.xlsmで保存し、バックアップを作成しておく(関数などを壊してしまったときの対策)。

 

⑥本体と条件表にデータを入力してボタンを押すとマクロが実行され、判定結果が表示される。

 

以上

VBAでマクロを組んだ

エクセルが楽しい。自動化という言葉に目がない怠惰な僕は、関数やVBAを駆使して手作業を減らせることに悦びを感じるからだ。

 

最近は関数とVBAの使い方を覚えるため、友達のお仕事効率化ツールの作成に勤しんでいる。

今回は、他の会社の経理部で働いている友達向けに、入力したデータが条件表のいずれかのレコードと一致する場合は○、しない場合は×を返すマクロを作った。

今までは入力されたデータが決められた条件に一致するかどうかを1件1件目で見て確認し、3時間も費やしていた作業が、このマクロを使うことで3秒で終わる。最高。

 

 

実際の画面はこんな感じ(見た目は汚いが)

 ・判定シート

f:id:ponkotuse:20170306005620p:plain

 B~F列にお客さんからもらったデータを入力する(実際は毎回150レコード前後あるらしいが今回はサンプルで10レコード入力。)。

右の判定ボタンを押すことでマクロが実行され、判定列に判定結果が返される。

今回は動きをわかりやすくするため計算に使う列(判定より右側の列)も色づけしている。

 

・条件表シート

f:id:ponkotuse:20170306005313p:plain

 

判定シートに貼り付けたレコードがこの中のどれかと一致したら○を返す。

 

 

判定ボタン押下後

f:id:ponkotuse:20170306005329p:plain

 

判定列に結果が表示される。

 

 

■雑な解説

①関数

レコードの各列の値を一つのセルに連結し、countif関数で比較を行う(H列)。

数式は、

=COUNTIF($J$2:$J$13,$I2)

となっており、$J$13の部分は入力したデータ数に応じて自動で変更される。

 

VBA

ソースを張り付けた方がわかりやすそうなので先に記載。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Sub 判定()

Dim i As Integer
i = 1

Range("G2").Select
Do Until ActiveCell.Offset(0, -1) = ""

ActiveCell.Offset(1, 0).Activate
i = i + 1

Loop

Range("K2").Copy
ActiveSheet.Paste Destination:=Range("G2:G" & i)

End Sub

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

前提として、K~N列に計算に必要な関数を用意してある。

初めに基準となるセルを選択し、Do~Loopでレコード数をカウントアップした後、計算列に関数を張り付ける。

同じようなマクロをK~N列の4つ分作り、4つのマクロを順番に実行するマクロを作成し、ボタンに登録することで今回の動きを実現。

結果だけ見るとすげー単純なツールではあるが、Excel初心者としてはかなり良い勉強になった。

 

最後に、技術向上のため、ツールの作成依頼を募集してます。

こんなツールがあったらいいのにな、なんてときはご相談下さい。

 

 

3/6追記 機能改善

・処理時間の高速化

 

マシンスペックや判定するレコード数によっては処理に時間がかかるため、

以下の記事を参考に(実質丸パクリ)処理速度の改善を測った。

遅い…重い…そんなエクセルVBAプログラムの処理速度を劇的に改善する方法

今回参考にさせて頂いたのは「画面表示の更新を停止」の部分。

 

レコード数は実際の業務より多めの200件で測定。

before

f:id:ponkotuse:20170306153530p:plain

 

after

f:id:ponkotuse:20170306153638p:plain

 

 

時間が半減。これは覚えておくと相当便利だぞ・・!

 

 

3/8 追記

レコード数の取得ロジックを変更

 

before

~~~~~~~~~~~~~~~~~~~~~~~~~

Range("G2").Select
Do Until ActiveCell.Offset(0, -1) = ""

ActiveCell.Offset(1, 0).Activate
i = i + 1

Loop

~~~~~~~~~~~~~~~~~~~~~~~~~

 

after

~~~~~~~~~~~~~~~~~~~~~~~~~

Do Until ActiveSheet.Cells(i, 6).Value = ""


i = i + 1

Loop

~~~~~~~~~~~~~~~~~~~~~~~~~

 

セルを移動しながら行数をカウントアップしてたけどそんな必要全くなくて、このロジック変更で処理時間が0秒になった、、ばかみたい。