アプリなどを開発するブログ

React Native / Swift / Ruby on Railsなどの学習メモ。


個人事業主1年目のワイがfreee確定申告で泣きを見た話。と対策

f:id:device_me:20160312113307p:plain

質問に答えるだけで簡単に確定申告ができるということで大変評判のいいfreee。
確定申告がサクサク終わった!と絶賛の声も多いですが、自分はかなり苦労した上で結局税理士さんに頼むことにしました。

と言ってもfreeeを攻撃したいわけでは全くなく、(むしろ、超辛いと言われている確定申告をすごい簡単にできるようにして下さったfreeeさんにすごく感謝しています!)
自分が苦労した点をここで共有することで、これから使う方に「freeeだって、完璧なわけではない」と理解した上でどのようにfreeeで普段の経理処理や確定申告を行えばいいかを共有できればと思います。

前提条件

自分はプログラマで、今年個人事業主1年目。
売上は700万ほどで、うち100万ほどが経費。
取引件数は収入、支出(経費とか) 含め600件ほど。

freeeで困ったポイント1

口座との自動同期がうまく作動していない

自分はUFJ銀行を使用していますが、口座の同期がうまくいかないことが多く、
チャットで連絡して色々と対応してもらったのですが、
結局うまくいかなかった分に関しては手動で入力を行うことになってしましました。

自分は9月の取引がごっそりと抜けていたのですが、税理士さんに指摘されるまで気づいていませんでした。

銀行側が会計サービスからのクロールを嫌がっているという説もあります。

参考リンク iphone-news.hatenablog.jp

確定申告前のこんな時なのですから、freeeさん側から「こういった事象が発生しているので気をつけて下さい」というお知らせと、ユーザー側でできる対応策を提示いただけると助かったかなと思います。

疑問

こういったことに気づかずに確定申告を終えてしまった場合、収入を申告しなかったとして罰則を受けてしまうのでしょうか??
その場合、freeeには全く責任はなく、自己責任になってしまうのでしょうか?
となるとやはり、自分だけで簡単確定申告というのは幻想で、やはり税理士さんにチェックしてもらわないとダメな気が。。

freeeで困ったポイント2

チャットの担当者さん達に確定申告の知識があるわけではない

freeeは自分の管理画面からすぐにスタッフの方とチャットができるようになっており、わからないことはすぐにチャットで聞けるので、非常に素晴らしいと思います。
基本的には平日10:00 ~ 18:00 は混雑していない限り対応してくれます。
また、確定申告前の時期に限り土日もチャットができたりと神対応です。

が、確定申告に関する知識が全てのスタッフさんが持ち合わせているわけではないようです。
しかし、ご本人が分からないことでも専門家に確認してくれているようですが、
案内してもらった内容が間違っていたことが後からわかった、ということがありました。

間違っていたことがわかっていなかったら、そのまま税務署に提出してしまっていたと思います。

結論としては、「わからないことがあってもチャットのスタッフさんが言った通りにやれば完璧に確定申告書類を作成できる」ということではなく、
チャットで聞ける内容で確実なのはあくまでもfreeeの使い方であって、それ以上の込み入った話を聞いてもfreeeが完全に解決してくれるというわけではない。
自分で調べたり、税理士に聞かねばならない場面もそれなりにある。
ということです。

freeeで困ったポイント3

たまに不具合があっても気づきにくい

家事按分の計算がうまくいっていないことが税理士さんからの指摘でわかりました。
freeeが計算してくれている数値が完全に正しいと信じ込んでいたので、そのまま税務署に提出していたら面倒なことになっていたのかなぁと思うとちょっと怖いです。

freeeで困ったポイント4

自分が処理方法を間違えていても気づきにくい

自分はmisocaで請求書を管理していて、その請求処理をfreeeに同期しています。
その請求額が実際に口座に振り込まれる金額と全くの同額であれば、freeeが勝手に判断して相殺してくれます。素晴らしい!
しかし、実際に振り込まれる金額は、
請求金額 - 振り込み手数料 だったり、 請求金額 - 源泉徴収額 - 振り込み手数料
だったりして、その辺はfreeeはいい具合に判断してくれません。
自分は全く気づかず、売上が2重に登録されてしまっていました。
これは自分のミスですが、「freeeがぜんぶ自動でやってくれるんだ!」という幻想を抱いていた私は、確定申告前に数字が合わずに四苦八苦しましたので、みなさん気をつけて下さい。

以上のことがあったので、結局税理士さんに頼みました

freeeには税理士さんを自分の管理画面に招待する機能があり、間違っている箇所などをリモートで指摘してくれるので大変便利です。
また、freeeが税理士さんを紹介してくれる仕組みもあります。

私は結局色々不安だったので、決算のチェック(今まで登録した取引が合っているかどうかのチェック)と、確定申告書類のチェックをお願いしました。
合計で約5万円前後です。
(これって安いのでしょうか?高いのでしょうか?)

ホリエモン氏が自分で確定申告やってるやつなんなの的な発言の記事で、 「イマドキ士業は仕事が減っているのでタダみたいな値段でやってくれるところはいくらでもある」って仰ってるんですけど、
タダみたいな値段っていくらくらいなんだろう。。 しかも彼は伝票整理とかも任せてタダみたいな値段か。。うーん、いくらなのか気になる。
そしてそういう値段でやってくださる方はどこにいるんだろうか。 horiemon.com

まとめ

ネット上の評判の良さから、「freeeが確定申告を全部やってくれる!!freeeスゲーー!!」と勝手に期待し過ぎてて痛い目を見ましたので、
あくまで「スッゲー便利な補助ツール」くらいに捉えていた方がよいかなと思いました。
副業としての収入を確定申告するとか、取引が少ない方(年間で30件とか)は多分自分だけで完結できると思いますが、
ガッツリ事業としてやってる人にはまだまだfreeeを使って自分だけで確定申告というのはなかなか厳しいものがあるかもしれません。
逆にfreeeだけで自分でやってますって人、いるんでしょうか?
もしくは、freeeは無理だったけどMFクラウド会計なら行けた!とか。。

こんな方もいらっしゃるようです。 rrokuta.hateblo.jp

matagotch.hatenablog.com

いろんな人の意見を聞いてみたいので、よろしければコメント欄などで聞かせて下さいませ!

El Capitanでgemがインストールできない場合の対処法

sudo gem install cocoapods

以前はこれだけでinstallできていたgemも、
El Capitanから導入されたrootless の関係でパーミッションで怒られるようになった。

ERROR:  While executing gem ... (Gem::FilePermissionError)
You don't have write permissions for the /Library/Ruby/Gems/2.0.0 directory.

対処法

インストールするパスを変えよう。

sudo gem install -n /usr/local/bin cocoapods

これでOK。

tvOS (Apple TV向けOS) でアプリ作りたい場合の記事まとめ

iOS9ベースの独自OSのようですね。
TVMLとかいう独自マークアップランゲージもあるようです。

Apple 公式

Interface Elements - Apple TV Human Interface Guidelines - Apple Developer

Resources - Apple TV Human Interface Guidelines - Apple Developer

tvOS Beta 版のダウンロード

Downloads - tvOS - Apple Developer

サンプルコード

developer.apple.com

developer.apple.com

developer.apple.com

その他

qiita.com

www.raywenderlich.com

tvOSの所感

便利そうなXcodeプラグインまとめ

github.com

github.com

github.com

github.com

github.com

Android ネイティブでゲーム作りたい時のメモ

Unityとかcocos 2Dとか使わずに、Androidの機能だけで簡単なゲームが作りたい。
その際に役立ったメモ。

基本的にはCanvasに描画していくのがいいみたい。
Bitmapで描画する方法と、Drawableで描画する方法がある。

Androidでゲームアプリをcanvasで作るときの注意点 | NJF

BitmapかDrawableか 二つの違いは、ゲーム制作に特に関係する部分を一言で言うと ・Bitmap 高速・拡大縮小に弱い ・Drawable 低速・拡大縮小に強い となります。

特に描画領域が大きいとDrawableは格段に遅くなります。pngの透明領域も描画領域に入りますので、できるだけ余白の少ない画像の方が良いようです。OpenGLと違って画像サイズは2の倍数でなくて良いので、削れる限り削りましょう。

iphone.vicent.jp

パラパラアニメでゲームをつくる

iphone.vicent.jp

monoist.atmarkit.co.jp

www.atmarkit.co.jp

#

canvasにanimationDrawableをはりつける stackoverflow.com

Canvasについての詳しい解説

tech.recruit-mp.co.jp

高速化について

www.atmarkit.co.jp

techbooster.org

描画速度的に、ViewよりもSurfaceViewを使うべし

[Android] [Java] SurfaceViewを用いた画面描画

AndroidのSurfaceViewの使い方 - Narrow Escape

もぷろぐ: Activity の動作について

SurfaceViewを用意する - @ANDROID開発

SurfaceViewのライフサイクル

http://blog.global-eng.co.jp/android/2012/01/23/activity%E3%81%A8surfaceview%E3%81%AE%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B5%E3%82%A4%E3%82%AF%E3%83%AB/

canvas内でanimationフレームワークを使う

stackoverflow.com

Canvasでパラパラアニメ

stackoverflow.com

あと、ゲーム関係ないけどmixiが公開してるこちらの資料、とてもいいですね。

github.com

www.slideshare.net

iOSでストリーミング再生中の動画キャプチャを撮りたいが方法がない

やりたいこと

サーバー上にあるm3u8ファイルをiPhoneアプリでストリーミング再生してる。
ボタンを押すと今映ってる映像の写真を撮ってローカルに保存したい。
一見、以下のような処理で簡単に取得できそうである。

let rect = view.bounds

UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
let context: CGContextRef = UIGraphicsGetCurrentContext()
view.layer.renderInContext(context)
let capturedImage : UIImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

が、真っ黒な画像が出力されるだけ。

色々調べたけど

stackoverflow.com

色々試したけどできないっぽいよという回答。

stackoverflow.com

A) UIGetScreenImage() という非公開メソッドで撮れるけど、リジェクトの可能性もあるよ
B) AVPlayerLayerで再生して、AVAssetImageGenerator の copyCGImageAtTime で撮れるよ
  -> ただしこれは、サーバー上の動画ファイルには使えないみたい

stackoverflow.com ここに載ってる方法でやってみたけど、imageRefが取得できない。
「できた!」って言ってる人は多分ローカルの動画ファイルでやってる気がする。

var url = NSURL(string: Constants.streamUrls[0])
if var asset = AVAsset.assetWithURL(url) as? AVAsset {
    var imageGenerator:AVAssetImageGenerator = AVAssetImageGenerator(asset: asset)
    var time = CMTimeMake(1, 1)
    var imageRef = imageGenerator.copyCGImageAtTime(time, actualTime: nil, error: nil)
    var thumbnail = UIImage(CGImage: imageRef)
    return thumbnail!
}        

以下のようなエラーを吐いてしまう。

Optional(Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo=0x17046c140 {NSUnderlyingError=0x174243840 "The operation couldn’t be completed. (OSStatus error -12782.)", NSLocalizedFailureReason=An unknown error occurred (-12782), NSLocalizedDescription=The operation could not be completed})

stackoverflow.com こちらもうまくいかない。

AVAssetImageGeneratorを使っての取得も試みたが、ダメだった。
恐らくこちらも有効なのはローカルのビデオのみで、リモートの動画はだめくさい?

func captureFromPlayer(player: AVPlayer, maxSize: CGSize) -> UIImage? {
        var actualTime: CMTime = CMTimeMake(0, 0)
        var error: NSError?
        
        var generator: AVAssetImageGenerator = AVAssetImageGenerator(asset: player.currentItem.asset)
        
        generator.maximumSize = maxSize
        
        println("player.currentTime() :\(player.currentTime())")

        
        var cgIm: CGImageRef = generator.copyCGImageAtTime(player.currentTime(), actualTime: &actualTime, error: &error)
        var image = UIImage(CGImage: cgIm)
        if error != nil {
            println("erorr : \(error?.localizedDescription)")
            println("CMTimeGetSeconds : \(CMTimeGetSeconds(actualTime))")
            if let current = streamView.player?.currentTime() {
                CMTimeGetSeconds(current)
            }
            
            return nil
        }
        return image
    }
    

こっちもやってみたけど、そもそもtracksが空。

func setupReader() {
        let url = NSURL(string: urlString)
        let asset:AVURLAsset = AVURLAsset(URL: url, options: nil)
        asset.loadValuesAsynchronouslyForKeys(["tracks"], completionHandler: {
            dispatch_sync(dispatch_get_main_queue(), { () -> () in
                var videoTrack: AVAssetTrack? = nil
                var tracks = asset.tracksWithMediaType(AVMediaTypeVideo)
                if tracks.count == 1 {
                    if let track = tracks[0] as? AVAssetTrack {
                        var error: NSError?
                        self.movieReader = AVAssetReader(asset: asset, error: &error)
                        if error != nil {
                            println("error: \(error)")
                        }
                        
                        var key:String = kCVPixelBufferPixelFormatTypeKey as String
                        var value:Int = kCVPixelFormatType_4444AYpCbCr16 as Int
                        var videoSettings = [key: value]
                        
                        
                        self.movieReader?.addOutput(AVAssetReaderTrackOutput(track: videoTrack, outputSettings: videoSettings))
                        self.movieReader?.startReading()
                    }
                }
            })
        })
    }

iOS7から実装されたスナップショットを撮るメソッドを試す

こんなんあったんですね。

let capture: UIView = view.snapshotViewAfterScreenUpdates(true)

スクリーン自体のスナップショットを撮影するメソッドも、UIScreenに実装されている。

let capture = UIScreen.mainScreen().snapshotViewAfterScreenUpdates(true)

だがこれも、UIViewをUIImageに変換するこちらのお決まりのメソッドに投げると、
AVPlayerLayerの所だけが真っ黒になって返ってくる。

func viewToImage(capturedView:UIView) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(capturedView.bounds.size, capturedView.opaque, 0.0)
        capturedView.layer.renderInContext(UIGraphicsGetCurrentContext())
        var img = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return img
    }

ちなみに、キャプチャのUIView自体は、ビデオの動画もバッチリ表示されている。
UIImageにする段階で、ビデオ動画がすっぽり抜け落ちる。

なんでや!なんでなんや!
うーむ。。

こんなのもあった

stackoverflow.com

これもだめだった

func snapByOpenGL() -> UIImage {
        if let time = streamView.playerItem?.currentTime() {
            if var pixelBuffer: CVPixelBufferRef = streamView.output?.copyPixelBufferForItemTime(time, itemTimeForDisplay: nil) {
                var ciImage = CIImage(CVPixelBuffer: pixelBuffer)
                
                var temporaryContext: CIContext = CIContext(options: nil)
                var rect = CGRectMake(0, 0, CGFloat(CVPixelBufferGetWidth(pixelBuffer)), CGFloat(CVPixelBufferGetHeight(pixelBuffer)))


                var videoImage: CGImageRef = temporaryContext.createCGImage(ciImage, fromRect: rect)
                var image = UIImage(CGImage: videoImage)
                return image!
            }
        }
        
        return UIImage()
    }