SlideShare a Scribd company logo
1 of 33
Download to read offline
CLOJURE で減価償却費計算
京都Clojureの集い 16.05
2016/5/21 @脳ジム
@ultrakanji
自己紹介
@ultrakanji
大阪の SIer
業務システムの設計、開発、保守
(管理会計、原価管理)
普段の使用言語 Java、Oracle (PL/SQL)
Clojure 歴 1 年(実経験 3ヶ月)
今日のお話
主に Clojure 初学者向け
Sler での Clojure 事例のひとつにでも
目次
動機
減価償却費計算を簡単に
実装
開発環境・ライブラリ
よかったこと
課題
動機
関数型言語を調べていて Clojure を知る
簡潔でパワフルな言語に魅了される
イミュータブル
コードはデータ
そこに EXCEL VBA の小案件の話が!
CLOJURE でぜひ!
別の人に振ってもよかったが絶好のチャンスと見た
会社を説得して Clojure で実装して無事完了
jar ファイル + 起動バッチでリリース
続いて簡易減価償却費計算の話が!
CLOJURE でぜひ!
再び会社を説得して Clojure で開発するチャンスを得た
簡易版なので DB は使用しない
前回同様 jar + 起動バッチでリリースすべく実装開始
減価償却費計算を簡単に
固定資産の取得にかかった費用を所定の期間に計上する会
計手続き
一時的にかかった経費を一定の期間でならして、正しく利益
計上するため
所定の期間が耐用年数
計算方法として定額法と定率法
ERP や会計パッケージに含まれることが多いが、新規資産な
どの計画分の計算は少ない
定額法
100万円のソフトウェアを耐用年数5年の定額法で償却
耐用年数と計算方法よりマスタから償却率を取得(0.5%)
年間償却額 = 取得価額 × 償却率 = 200,000
月間償却額 = 年間償却費 ÷ 12 ≒ 16,666
定率法
200万円の機械装置を耐用年数8年の定率法で償却
耐用年数と計算方法よりマスタから償却率を取得(0.25%)
(初年度)年間償却額 = 取得価額 × 償却率 = 500,000
(2年目)年間償却額 = 未償却残高 × 償却率 = 375,000
(3年目)年間償却額 = 未償却残高 × 償却率 = 281,250
現在の定率法の場合、保証率と改定償却率もマスタから取得す
るが、ここでは割愛。
減価償却費のイメージ
定額法と定率法ののイメージはこんな感じ
で、何をしたいか?
固定資産ごとに計算した結果を月別に Excel に出力したい(イメ
ージ)
資産 2017/4 2017/5 2017/6 ... 2018/4 ...
ソフトA 16,667 16,667 16,667 ... 16,667 ...
機械装置B 41,667 41,667 41,667 ... 31,250 ...
実装
全体構成
マスタファイル(Excel)読み込み → atom
固定資産ファイル(Excel)読み込み → atom
償却費計算起点
年間償却費計算 → リスト
月間償却費計算 → マップ
固定資産情報と計算結果をマージして → atom
Excel 出力
マスタファイル読み込み
マスタデータはあとで取得しやすいように k / v で atom に保持。
※以降サンプルコードです。項目名や関数名も日本語にしてい
ます。
(:require [dk.ative.docjure.spreadsheet :as ss]) 
(defn load­master [file sheet­name] 
  (­>> (ss/load­workbook file) 
       (ss/select­sheet sheet­name) 
       (ss/select­columns {:A :償却方法 :B :耐用年数 
                           :C :償却率 :D :改定償却率 :E :保証率}) 
       (drop 1) 
       (group­by #(select­keys % [:償却方法 :耐用年数])) 
       (reset! 償却率マスタのatom))) 
@償却率マスタatom 
=> 
{{:償却方法 "定率", :耐用年数 3} [{:償却方法 "定率", :耐用年数 3, :償却率 0.667, 
  :改定償却率 1.000, :保証率 0.11089}], 
 {:償却方法 "定額", :耐用年数 3} [{:償却方法 "定額", :耐用年数 3, :償却率 0.334}],
 ...} 
マスタの atom から情報を取得するとき
(let [key (into {} {:償却方法 償却方法 :耐用年数 耐用年数})] 
  (get @償却率マスタatom key)) 
固定資産ファイル読み込み
固定資産データは複数ファイルを取り込むので swap! で atom
を追加更新。
(:require [clojure.java.io :as io]) 
(defn 固定資産ファイル読み込み [] 
  (doseq [file (file­seq (io/file "ファイル/パス"))] 
    (­>> (固定資産ファイル読み込み共通関数 file) 
         (filter #(identity (:キー項目 %))) ;; (1)  
         (map (fn [m] 
                (into {} (map #(conj {:file­name (.getName file)} %) m)))) 
         (swap! 固定資産atom assoc­in [@ファイルカウンタ])))) ;; (3)
(1): キー項目を見て空行を読み飛ばしなども簡単に
(2): 読み込んだ内容にファイル名を追加するなど(例外処理
用)
(3): 複数レコード(nested associative structure)を保持する
ため以下の構文
swap! atom assoc­in k v 
@固定資産atom 
=> 
[({:資産名称 "ソフトウェアA", :取得価額 1000000, :償却開始年月 42917.0, 
   :償却方法 "定額", :耐用年数 5, :ファイル名 "a.xls", ...} 
  {:資産名称 "機械装置B", :取得価額 2000000, :償却開始年月 42917.0, 
   :償却方法 "定率", :耐用年数 8, :ファイル名 "b.xlsx", ...} 
  )] 
年間償却費計算はリストで返す
定率法は長いので定額法のサンプル。
耐用年数分の再帰関数。
(defn 定額法年間償却費計算 [資産レコード] 
  (let [耐用年数 (:耐用年数 資産レコード) 
        取得価額 (:取得価額 資産レコード) 
        償却率   (:償却率 資産レコード)] 
    (loop [x []   ;; 年間償却費(ベクタ) 
           sum 0  ;; 償却累計 
           cnt 1] 
        (if (= cnt 耐用年数) 
          (flatten (conj x (­ 取得価額 sum 1))) 
          (recur
            (conj x (Math/round (* 取得価額 償却率))) 
            (+ sum (Math/round(* 取得価額 償却率))) 
            (inc cnt)))))) 
(定額法年間償却費計算 "ソフトウェアのレコード")=> 
(200000 200000 200000 200000 199999) 
償却費計算の結果はマップで返す
月別償却額は、年別償却額リストを受け取り、12ヶ月の均等割
をして、償却月と償却費のマップを返すだけ(割愛)。
償却費計算関数はその月別償却額と固定資産情報を merge し
たマップを返す。
(defn 償却費計算 [資産] 
  (let [資産統合データ (マスタ値取得関数 資産) 
        年別償却額 (年間償却費計算 資産統合データ) 
        月別償却額 (月間償却額計算 資産統合データ 年別償却額)] 
    (merge (into {} {:資産名称 (:資産名称 資産統合データ) 
                     :取得価額 (:資産名称 資産統合データ)}) 
                     月別償却額))) 
償却費計算の起点にてマップの結果を
ATOM にセット
=> 
[{:資産名称 "ソフトウェアA", :2017­04 16667, :2017­05 16667, 
  :2018­04 156250..., :2022­03 16667, ...} 
 {:資産名称 "機械装置B", :2017­04 41667, :2017­05 41667, :2018­04 31250... 
  :2025­03 13131, ...}] 
EXCEL 出力
docjure がネストしたベクタでワークブックを作ってくれる。
償却費計算結果 atom のマップをベクタに変換する。
[["資産名" "2017­04" "2017­05" "2017­06" ...] 
 ["ソフトA" 16667 16667 16667 ...] 
 ["機械装置B" 41667 41667 41667 ...]] 
開発環境・使用したライブラリ
開発環境
Windows 7
Intellij IDEA Community Edition with Cursive Plugin
REPL も快適。
使用したライブラリ
一部 POI 関数を直接使ったものの、Excel ファイルの読み書
きから、ブック・シート操作、セルの書式適用まで一通り活躍。
ロギング。
ファイルシステムユーティリティ。
Joda Time のラッパーライブラリ。Excel 上のシリアル値日付
の変換や日付計算に。
環境管理ライブラリ。本番環境と開発環境でログレベルを変
更するのに使用。
dk.ative/docjure
com.taoensso/timbre
me.raynes/fs
clj-time
environ
よかったこと
Excel VBA での苦闘を回避
成果物も VBA でやるより堅牢で高速ないいものができた
Excel からデータを抽出できればあとは Clojure の世界
関数型言語での実装の理解
データ構造の理解
Clojure 書いていて楽しい
課題
テストを書けていないこと
prismatic/schema でより強固に
参考
減価償却費計算の組み立て方で大いに参考にした
(deprecation.clj)。
Clojure で Excel を扱えることを知った最初の記事。
poi り方の参考に。
REPL をいまいち使いこなせていないとき参考に。
sebhoss/ nj
Light TableでリアルタイムExcelパース (Light Tableの使い方
第2章)
Clojure から POI ってみる
REPLライフをもっと快適に
ありがとうございました。

More Related Content

Viewers also liked

2016 Guide to User Data Security
2016 Guide to User Data Security2016 Guide to User Data Security
2016 Guide to User Data SecuritySean Bryant
 
Why people are wanting to gain permanent residency in australia
Why people are wanting to gain permanent residency in australiaWhy people are wanting to gain permanent residency in australia
Why people are wanting to gain permanent residency in australiaAnkit Kumar Pandey
 
Ridiculously Easy Layouts with Flexbox
Ridiculously Easy Layouts with FlexboxRidiculously Easy Layouts with Flexbox
Ridiculously Easy Layouts with FlexboxEric Carlisle
 
Virtualus mobilumas aukštojo mokslo studijoms
Virtualus mobilumas aukštojo mokslo studijomsVirtualus mobilumas aukštojo mokslo studijoms
Virtualus mobilumas aukštojo mokslo studijomsAirina Volungeviciene
 
Atrapados en las redes caught in networks
Atrapados en las redes caught in networksAtrapados en las redes caught in networks
Atrapados en las redes caught in networksFrancisca garc?
 
MozCon - Mobilegeddon
MozCon - MobilegeddonMozCon - Mobilegeddon
MozCon - MobilegeddonSuzzicks
 
El modelo educativo_2016
El modelo educativo_2016El modelo educativo_2016
El modelo educativo_2016Pablo Cortez
 
Servo drive application for box labeling
Servo drive application for box labelingServo drive application for box labeling
Servo drive application for box labelingElmo Motion Control
 
5º Básico A: Informativo Nº 29: Semana del 03 al 07 de octubre
5º Básico A: Informativo Nº 29: Semana del 03 al 07 de octubre5º Básico A: Informativo Nº 29: Semana del 03 al 07 de octubre
5º Básico A: Informativo Nº 29: Semana del 03 al 07 de octubreColegio Camilo Henríquez
 
OEE River Guide Training Checklist_2015
OEE River Guide Training Checklist_2015OEE River Guide Training Checklist_2015
OEE River Guide Training Checklist_2015Colter Christensen
 

Viewers also liked (11)

2016 Guide to User Data Security
2016 Guide to User Data Security2016 Guide to User Data Security
2016 Guide to User Data Security
 
Why people are wanting to gain permanent residency in australia
Why people are wanting to gain permanent residency in australiaWhy people are wanting to gain permanent residency in australia
Why people are wanting to gain permanent residency in australia
 
Art Portfolio
Art PortfolioArt Portfolio
Art Portfolio
 
Ridiculously Easy Layouts with Flexbox
Ridiculously Easy Layouts with FlexboxRidiculously Easy Layouts with Flexbox
Ridiculously Easy Layouts with Flexbox
 
Virtualus mobilumas aukštojo mokslo studijoms
Virtualus mobilumas aukštojo mokslo studijomsVirtualus mobilumas aukštojo mokslo studijoms
Virtualus mobilumas aukštojo mokslo studijoms
 
Atrapados en las redes caught in networks
Atrapados en las redes caught in networksAtrapados en las redes caught in networks
Atrapados en las redes caught in networks
 
MozCon - Mobilegeddon
MozCon - MobilegeddonMozCon - Mobilegeddon
MozCon - Mobilegeddon
 
El modelo educativo_2016
El modelo educativo_2016El modelo educativo_2016
El modelo educativo_2016
 
Servo drive application for box labeling
Servo drive application for box labelingServo drive application for box labeling
Servo drive application for box labeling
 
5º Básico A: Informativo Nº 29: Semana del 03 al 07 de octubre
5º Básico A: Informativo Nº 29: Semana del 03 al 07 de octubre5º Básico A: Informativo Nº 29: Semana del 03 al 07 de octubre
5º Básico A: Informativo Nº 29: Semana del 03 al 07 de octubre
 
OEE River Guide Training Checklist_2015
OEE River Guide Training Checklist_2015OEE River Guide Training Checklist_2015
OEE River Guide Training Checklist_2015
 

Similar to Clojure で減価償却費計算

入門ClojureScript
入門ClojureScript入門ClojureScript
入門ClojureScriptsohta
 
TypeScriptをオススメする理由
TypeScriptをオススメする理由TypeScriptをオススメする理由
TypeScriptをオススメする理由Yusuke Naka
 
Clojure座談会 #1 LT 独自コレクションを定義しよう
Clojure座談会 #1 LT 独自コレクションを定義しようClojure座談会 #1 LT 独自コレクションを定義しよう
Clojure座談会 #1 LT 独自コレクションを定義しようKeisuke Fukuda
 
Clojureの世界と実際のWeb開発
Clojureの世界と実際のWeb開発Clojureの世界と実際のWeb開発
Clojureの世界と実際のWeb開発Tsutomu Yano
 
「はじめてのClojure」出版記念!Light Tableを使ってClojureに触れてみよう!【第2回】
「はじめてのClojure」出版記念!Light Tableを使ってClojureに触れてみよう!【第2回】「はじめてのClojure」出版記念!Light Tableを使ってClojureに触れてみよう!【第2回】
「はじめてのClojure」出版記念!Light Tableを使ってClojureに触れてみよう!【第2回】schoowebcampus
 
Arachne Unweaved (JP)
Arachne Unweaved (JP)Arachne Unweaved (JP)
Arachne Unweaved (JP)Ikuru Kanuma
 
2010-10-2 FxUG 名古屋勉強会 HTML5で遊んでみよう
2010-10-2 FxUG 名古屋勉強会 HTML5で遊んでみよう2010-10-2 FxUG 名古屋勉強会 HTML5で遊んでみよう
2010-10-2 FxUG 名古屋勉強会 HTML5で遊んでみようMori Shingo
 
運用ドキュメントの構造化(案)
運用ドキュメントの構造化(案)運用ドキュメントの構造化(案)
運用ドキュメントの構造化(案)Operation Lab, LLC.
 
Jslug勉強会 awsと比較するネットワーク
Jslug勉強会 awsと比較するネットワークJslug勉強会 awsと比較するネットワーク
Jslug勉強会 awsと比較するネットワークHideaki Tokida
 
帰ってきた インフラ野郎 Azureチーム ~Azure データセンターテクノロジー解体新書2018春~ - de:code2018
帰ってきた インフラ野郎 Azureチーム ~Azure データセンターテクノロジー解体新書2018春~ - de:code2018帰ってきた インフラ野郎 Azureチーム ~Azure データセンターテクノロジー解体新書2018春~ - de:code2018
帰ってきた インフラ野郎 Azureチーム ~Azure データセンターテクノロジー解体新書2018春~ - de:code2018Toru Makabe
 
Task and Time monitoring with Backlog and Toggl
Task and Time monitoring with Backlog and TogglTask and Time monitoring with Backlog and Toggl
Task and Time monitoring with Backlog and TogglYukiya Hayashi
 
02 singletonとflyweightを使った省エネapex
02 singletonとflyweightを使った省エネapex02 singletonとflyweightを使った省エネapex
02 singletonとflyweightを使った省エネapexTerraSky
 
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発慎一 古賀
 
ふくてん#2 Powershellとossで作るお手軽モニタリング環境
ふくてん#2 Powershellとossで作るお手軽モニタリング環境ふくてん#2 Powershellとossで作るお手軽モニタリング環境
ふくてん#2 Powershellとossで作るお手軽モニタリング環境yukiusagi2052
 
ML system design_pattern
ML system design_patternML system design_pattern
ML system design_patternyusuke shibui
 
Agile Software Development for Newbies
Agile Software Development for NewbiesAgile Software Development for Newbies
Agile Software Development for NewbiesNaoto Nishimura
 

Similar to Clojure で減価償却費計算 (20)

入門ClojureScript
入門ClojureScript入門ClojureScript
入門ClojureScript
 
TypeScriptをオススメする理由
TypeScriptをオススメする理由TypeScriptをオススメする理由
TypeScriptをオススメする理由
 
Clojure座談会 #1 LT 独自コレクションを定義しよう
Clojure座談会 #1 LT 独自コレクションを定義しようClojure座談会 #1 LT 独自コレクションを定義しよう
Clojure座談会 #1 LT 独自コレクションを定義しよう
 
Clojureの世界と実際のWeb開発
Clojureの世界と実際のWeb開発Clojureの世界と実際のWeb開発
Clojureの世界と実際のWeb開発
 
「はじめてのClojure」出版記念!Light Tableを使ってClojureに触れてみよう!【第2回】
「はじめてのClojure」出版記念!Light Tableを使ってClojureに触れてみよう!【第2回】「はじめてのClojure」出版記念!Light Tableを使ってClojureに触れてみよう!【第2回】
「はじめてのClojure」出版記念!Light Tableを使ってClojureに触れてみよう!【第2回】
 
Groovyコンファレンス
GroovyコンファレンスGroovyコンファレンス
Groovyコンファレンス
 
Arachne Unweaved (JP)
Arachne Unweaved (JP)Arachne Unweaved (JP)
Arachne Unweaved (JP)
 
Ll tiger clojure
Ll tiger clojureLl tiger clojure
Ll tiger clojure
 
2010-10-2 FxUG 名古屋勉強会 HTML5で遊んでみよう
2010-10-2 FxUG 名古屋勉強会 HTML5で遊んでみよう2010-10-2 FxUG 名古屋勉強会 HTML5で遊んでみよう
2010-10-2 FxUG 名古屋勉強会 HTML5で遊んでみよう
 
鹿駆動
鹿駆動鹿駆動
鹿駆動
 
運用ドキュメントの構造化(案)
運用ドキュメントの構造化(案)運用ドキュメントの構造化(案)
運用ドキュメントの構造化(案)
 
Jslug勉強会 awsと比較するネットワーク
Jslug勉強会 awsと比較するネットワークJslug勉強会 awsと比較するネットワーク
Jslug勉強会 awsと比較するネットワーク
 
帰ってきた インフラ野郎 Azureチーム ~Azure データセンターテクノロジー解体新書2018春~ - de:code2018
帰ってきた インフラ野郎 Azureチーム ~Azure データセンターテクノロジー解体新書2018春~ - de:code2018帰ってきた インフラ野郎 Azureチーム ~Azure データセンターテクノロジー解体新書2018春~ - de:code2018
帰ってきた インフラ野郎 Azureチーム ~Azure データセンターテクノロジー解体新書2018春~ - de:code2018
 
Task and Time monitoring with Backlog and Toggl
Task and Time monitoring with Backlog and TogglTask and Time monitoring with Backlog and Toggl
Task and Time monitoring with Backlog and Toggl
 
02 singletonとflyweightを使った省エネapex
02 singletonとflyweightを使った省エネapex02 singletonとflyweightを使った省エネapex
02 singletonとflyweightを使った省エネapex
 
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
 
ふくてん#2 Powershellとossで作るお手軽モニタリング環境
ふくてん#2 Powershellとossで作るお手軽モニタリング環境ふくてん#2 Powershellとossで作るお手軽モニタリング環境
ふくてん#2 Powershellとossで作るお手軽モニタリング環境
 
ML system design_pattern
ML system design_patternML system design_pattern
ML system design_pattern
 
第11回しゃちほこオラクル倶楽部
第11回しゃちほこオラクル倶楽部第11回しゃちほこオラクル倶楽部
第11回しゃちほこオラクル倶楽部
 
Agile Software Development for Newbies
Agile Software Development for NewbiesAgile Software Development for Newbies
Agile Software Development for Newbies
 

Clojure で減価償却費計算