echo("備忘録");

IT技術やプログラミング関連など、技術系の事を備忘録的にまとめています。

【解いてみた】平成28年度秋期 応用情報技術者試験午後問題 問1(情報セキュリティ)

実は昨日ツイートしたんですが、昨日は秋期情報処理技術者試験の試験日だったんですよね。

僕は今年の春に応用情報に合格しましたが、もう半年ですか…早いものです。(本当は秋にセスペを受ける予定でしたが、仕事関連がものすごくバタバタしすぎたのでパス。来春にデスペ、来秋にセスペを受ける予定です。)*1
熊本地震の直後の試験で、問2(経営戦略)の内容が「大地震発生時のBCP」だったので、結構ネットで話題になってましたね。(僕は選択しませんでしたが)

という訳で、今回の試験問題が発表されたので、試しに問1(情報セキュリティ)を解いてみました。
こんなもんでどうでしょうか?(注:答えが正解である保証はどこにもないです)

設問1
(1) ウ(パスワードを3回続けて…)
(2) ア、イ(IDと同じ文字列を…/英字・数字・記号が存在する…)

設問2
ウ(SSL

設問3
(1)指紋特徴点だけでは元の指紋全体を再現できないから。(25文字)
(2)d:認証に必要な情報をシステム管理者が一括管理できる(24文字)
   e:他人受入率と本人拒否率が共に低く、信頼性が高い(23文字)
   f:B

問題的には、前回より簡単になってる感じですね。(というか前回は文章の書き方が悪いような…)

残り(今のところ、アルゴリズム・DB・システム開発技術を予定。あと一問は…何にしますかね。)はまた後日。

*1:10/19追記:そういえばセスペって今回で最後で、次からは「情報処理安全確保支援士」になるんでした。そう考えると、無理にでも受けたほうが良かったのかも(まあ、そんな簡単に合格なんてできないか…)

Xamarinの導入

業務ではもっぱらVB.netなのですが、「やっぱりC#.netの方がいいなあ…」って感じながら作業してます。
昔はVB一本だったのですが、他の言語も覚えると「融通がきく」点が逆に「独特な言語」って感じてしまって、むしろコード記述が難しく感じます。


さて、そんな感じで業務でC#.netから離れているので、リハビリを兼ねてXamarinでスマホの開発でもやろうかな、と思いました。
しばらくスマホ開発からも離れていたので、こちらのリハビリにも良いかと思いまして。

1.インストール
で、インストールなのですが、ちょっとググったらこんな記事が…

ytabuchi.hatenablog.com

うーん、こりゃあ厄介そうだ…
とは言え、やらないと始まらないのですが。

とりあえず「プログラムの追加と削除」から「変更」をクリックして、

 ・Android ネイティブ開発キット (R10E、32ビット) 3GB
 ・Android SDK 1GB 未満
 ・Android SDK セットアップ (API レベル 19および21) 5GB
 ・Java SE 開発キット (7.0.550.13) 1GB

ココらへんを入れておけば大丈夫っぽい。(なお、UWPやWindows Store開発をやる場合、もっと必要です。)

あとは時間が経てば、インストール完了するはず。(まあ、これが結構時間を食うんですが…)

2.実機デバッグ環境構築
とりあえずインストールは完了しましたが、どうやらAndroidエミュレーターはクッソ重いらしく、実機デバッグにすべきとのこと。
幸いAndroidの実機は持っていたので、実機デバッグ環境を構築してみました。

Google USB Driverのインストール】
 [ツール]-[Android]-[Android SDK Manager]を選択するとAndroid SDK Managerが開くので、下の方にある[Extras]から「Google USB Driver」をインストール。

Android端末のUSBデバッグの有効化】
 [設定]-[端末情報]を開き、「ビルド番号」を連打すれば「開発者モード」になる(と思う)ので、その中の「USBデバッグを有効にする」にチェックを付ける。

android_winusb.infの変更】
 先程インストールしたGoogle USB Driverのフォルダ内に「android_winusb.inf」というファイルがあるので、この中の[Google.NTx86]と[Google.NTamd64]の2つのセクションに、以下の記載を追加する。

%SingleAdbInterface% = USB_Install, USB\VID_(自分のAndroidのVID)&PID_(自分のAndroidのPID)
%CompositeAdbInterface% = USB_Install, USB\VID_(自分のAndroidのVID)&PID_(自分のAndroidのPID)&MI_01

※自分のAndroidのVIDとPIDは「デバイスマネージャー」に表示されているAndroid端末のプロパティから[詳細情報]-[ハードウェアID]を選択すると確認することが出来ます。
android_winusb.infは管理者権限で編集ソフト(テキストエディタなど)を開かないと編集できません。

と、大抵のサイトでは「これでOK!」という事だったのですが、僕の環境ではダメで、デバイスマネージャーを確認した所、どうやらADBドライバのインストールも必要でした。

【ADBドライバのインストール】

  1. バイスマネージャでADBデバイス(「他のデバイス」に表示されていると思う)に「!」が表示されているので、右クリックから「ドライバソフトウェアの更新」を選択。
  2. 「どのような方法で…」と表示されたら、下の「コンピュータを参照して…」を選択。
  3. 「コンピュータ上のドライバ…」と表示されたら、下の「コンピュータ上のデバイスの一覧から…」を選択。
  4. 「次の一覧から…」は「すべてのデバイスを表示」を選択。し、「このハードウェアのために…」が表示されたら「ディスク使用」をクリックし、「製造元のファイルのコピー元」に、最初にインストールしたGoogle USB Driverのフォルダを指定する*1
  5. 「モデル」の一覧が表示されたら「Android ADB Interface」を選択。(このあと警告が出る場合があるが「はい」を選択でOK。)
  6. ドライバ更新が正常に終了すれば、Android実機の方で「USBデバッグを有効にしますか?(「このパソコンのRPAキーのフィンガープリント…)」という表示が出るので「OK」をクリック。(そのパソコンで今後も開発作業をするなら「このパソコンからの…」にチェックを入れておくと良いです。)

これでVSのデバッグ環境にAndroid名が表示できれば、めでたく実機デバッグが可能です!(表示されない場合、一度VSを再起動してみて下さい。)
これでバリバリ開発…


とはいかないんですよね、おそらく。


私の環境でもそうなんですが、他の方同様PCLプロジェクトを開こうとすると、原因不明のエラーが出まくりで、ネットの情報を色々調べて手は打ったんですが、まだ解決には至っていません…
(なお、下記の方が素晴らしいテンプレートを公開されています。私もこれでビルドが出来ました。)
ytabuchi.hatenablog.com

またiOSアプリは開発こそ可能ですが、結局デバッグにはMacが必要なので「それならXCodeで…」とも感じてしまいますし。
そうなるとAndroidですが、EclipseAndroid Studioに比べるとまだまだ発展途上な感は否めません。(C#Windows単体でスマホ開発が出来る、という点は魅力的ですけどね。)

とはいえ、「AndroidiPhoneなどのクロスプラットフォーム開発が可能」と言うのはやはり魅力的ですので、今後の発展に期待、って感じでしょうかね。

*1:僕の環境では「c:\android\sdk\extras\google\usb_driver」にありました。パスがわからない場合、Android SDK ManagerでGoogle USB Driverにマウオーバーすれば、パスが表示されます。

【やってみた】1時間プログラミング(ソースコード)

昨日書いた、オセロのソースコードです。

※ワークシート側の処理

Option Explicit

'「ゲーム開始」ボタンクリック処理
Private Sub CommandButton1_Click()
    
    Call Init
    
End Sub

'盤上のマスをダブルクリックしたときの処理
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

    'セルの行と列
    Dim row As Integer, col As Integer
    Dim resultValue As Boolean, resultCheckAll As Integer
    
    row = Target.row
    col = Target.Column
    
    '盤の外とか、すでに石が置いてあるマスには置けない。
    If ((8 < row) Or (8 < col)) Then
        Exit Sub
    ElseIf (CELLKIND.NOPEACE <> board(row, col)) Then
        MsgBox "すでに石がある場所には置けません。", vbOKOnly + vbExclamation, GAME_NAME
        Exit Sub
    End If

    '現在の手番のプレーヤーが、そこに石を置けるかのチェック
    resultValue = checkPutPeace(row, col, True)
    
    If resultValue Then
        '置けた場合、相手が石を置けるマスがあるかをチェック
        resultCheckAll = checkPutPeaceAllCell()
        
        If (1 = resultCheckAll) Then
        
            'マスがない場合、パス扱いにして、次の手番のプレーヤーが石を置ける益があるかチェックする。
            Dim strTeban As String
            
            If (CELLKIND.SENTE = turn) Then
                strTeban = "先手"
            ElseIf (CELLKIND.GOTE = turn) Then
                strTeban = "後手"
            End If
            
            MsgBox strTeban & "は相手の石を裏返せないので、パスします。", vbOKOnly + vbInformation, GAME_NAME
            
            turn = 3 - turn
            resultCheckAll = checkPutPeaceAllCell()
            
            If (1 = resultCheckAll) Then
                '2人共石を置けない場合は、試合終了。勝敗判定へ。
                If (CELLKIND.SENTE = turn) Then
                    strTeban = "先手"
                ElseIf (CELLKIND.GOTE = turn) Then
                    strTeban = "後手"
                End If
                
                MsgBox strTeban & "も相手の石を裏返せないので、ゲームを終了し、勝敗を判定します。", vbOKOnly + vbInformation, GAME_NAME
                Call judge
            End If
        ElseIf (-1 = resultCheckAll) Then
            'マスが全部埋まった場合、勝敗判定へ。
            Call judge
        End If
    Else
        'ダブルクリックした場所に置いても相手の石を裏返せない場合、そこには置けない。
        MsgBox "相手の石を裏返せないので、そこには置けません。", vbOKOnly + vbExclamation, GAME_NAME
    End If
    
End Sub

'石を置いた時、相手が石をおけるマスがあるかどうかをチェックする。
Private Function checkPutPeaceAllCell() As Integer

    Dim i As Integer, j As Integer
    Dim isPut As Boolean, isExistEmpty As Boolean
    
    isPut = False
    isExistEmpty = False
    
    For i = 1 To 8
        For j = 1 To 8
            
            If (board(i, j) = CELLKIND.NOPEACE) Then
                '石が置いてないマスがあったら、isExistEmptyフラグを立てる。
                '(全部のマスに石が置いてあるなら、相手の処理を行わずに勝敗判定を行えば良いから。)
                isExistEmpty = True
                isPut = checkPutPeace(i, j, False)
            End If
            
            '1つでも石を置けるマスがあるなら、そこで処理終了。(下も同じ)
            If (isPut) Then
                Exit For
            End If
        Next
        
        If (isPut) Then
            Exit For
        End If
    Next

    '戻り値の設定
    If (isPut) Then
        '石を置けるマスがある。
        checkPutPeaceAllCell = 0
    Else
       If (isExistEmpty) Then
           '相手が石を置けるマスはないが、石が置いていないマス自体はある。
           checkPutPeaceAllCell = 1
       Else
           '全部のマスが埋まっている。
           checkPutPeaceAllCell = -1
       End If
    End If
    
End Function



※標準モジュール側の処理

Option Explicit
Option Base 0

'「インデックスが有効範囲にありません」エラーのエラー番号
Const INDEX_OUT_OF_RANGE As Integer = 9
'メッセージボックスに表示するタイトル
Public Const GAME_NAME As String = "リバーシ"

'盤の状態を保持する2次元配列
Public board(1 To 8, 1 To 8) As CELLKIND
'手番の状態
Public turn As CELLKIND

'盤や手番の状態を定義してある列挙体
Public Enum CELLKIND
    NOPEACE = 0    '石がない
    SENTE = 1      '先手
    GOTE = 2       '後手
    GAME_END = -1  'ゲーム終了
End Enum

'checkReverse()で使用する、各方向のオフセット値を格納する配列
Private range_value(0 To 7)
'裏返すマス情報を保持するコレクション(裏返せるマス全て, 方向単位の裏返せるマス)
Private turnCellCollection As New Collection, turnCellCollection_tmp As New Collection

'初期化処理
Public Sub Init()
On Error Resume Next

Dim i As Integer, j As Integer

'各方向のオフセット値を設定
range_value(0) = Array(-1, -1)
range_value(1) = Array(-1, 0)
range_value(2) = Array(-1, 1)
range_value(3) = Array(0, -1)
range_value(4) = Array(0, 1)
range_value(5) = Array(1, -1)
range_value(6) = Array(1, 0)
range_value(7) = Array(1, 1)

For i = 1 To 8
    For j = 1 To 8
     
     '盤の情報を設定。
    If (((4 = i) And (4 = j)) Or ((5 = i) And (5 = j))) Then
        board(i, j) = CELLKIND.SENTE
    ElseIf (((4 = i) And (5 = j)) Or ((5 = i) And (4 = j))) Then
        board(i, j) = CELLKIND.GOTE
    Else
        board(i, j) = CELLKIND.NOPEACE
    End If
    
    Call draw(i, j)
    
    Next
Next

turn = CELLKIND.SENTE

Set turnCellCollection = New Collection
Call writeText

End Sub

'そのマスに手番の石が置けるかどうか。
'(isPutActuallyはTrueなら実際に裏返す。falseなら裏返せるかチェックするだけで、実際には裏返さない)
Public Function checkPutPeace(ByVal row As Integer, ByVal col As Integer, ByVal isPutActually As Boolean)
   
   Dim resultValue As Boolean, isExistTurn As Boolean
   Dim i As Integer, j As Integer
   
   isExistTurn = False
   
   'そもそも石があるなら、絶対に置けない。
   If (CELLKIND.NOPEACE <> board(row, col)) Then
       checkPutPeace = isExistTurn
       Exit Function
   End If
   
   For i = LBound(range_value) To UBound(range_value)
       resultValue = checkReverse(row + range_value(i)(0), col + range_value(i)(1), range_value(i)(0), range_value(i)(1), True)
       
       '石が置ける、かつ実際に裏返すなら、「裏返すマス」に「その方向の裏返せるマス」を追加。
       If resultValue Then
           If (isPutActually) Then
               For j = 1 To turnCellCollection_tmp.count
                   turnCellCollection.Add turnCellCollection_tmp(j)
               Next
           End If
           
           isExistTurn = True
       End If
       
       '「その方向の裏返せるマス」を初期化。
       Set turnCellCollection_tmp = New Collection
       
       '実際には裏返さない場合、1つでも石を置けるマスがあった時点で処理終了。(全チェックする必要はない)
       If ((Not isPutActually) And isExistTurn) Then
           Exit For
       End If
   Next
   
   If (isExistTurn And isPutActually) Then

       '実際に裏返す場合、盤の情報を更新して、手番を交代する。
       If (0 < turnCellCollection.count) Then
           
           For i = 1 To turnCellCollection.count
           
               Dim collection_val As Variant, collection_row As Integer, collection_col As Integer
               
               collection_val = turnCellCollection(i)
               collection_row = collection_val(0)
               collection_col = collection_val(1)
               
               board(collection_row, collection_col) = turn
               Call draw(collection_row, collection_col)
           Next
       End If
       
       board(row, col) = turn
       Call draw(row, col)
       
       turn = 3 - turn
       Call writeText
       
   End If
   
   '「すべての裏返せるマス」を初期化。
   Set turnCellCollection = New Collection
   checkPutPeace = isExistTurn
   
End Function

'「そのマスの石が裏返せるか」をチェックする。
'range_value_row,range_value_colはそれぞれ基準のマスから見たチェックするマスのオフセット、isFirstChackはそのマスが基準となるマスの隣かどうか。
Function checkReverse(ByVal row As Integer, ByVal col As Integer, ByVal range_value_row As Integer, ByVal range_value_col As Integer, ByVal isFirstCheck As Boolean) As Boolean
On Error GoTo checkReverseException

    Dim targetCellValue As CELLKIND
    Dim resultValue As Boolean
    
    'チェックするマスの情報を格納
    resultValue = False
    targetCellValue = board(row, col)
    
    If (isFirstCheck) Then
        '基準のマスの隣のマスが相手の石でなければ裏返せない。相手の石ならさらに次のマスを再帰処理でチェック。
        If ((turn <> targetCellValue) And (CELLKIND.NOPEACE <> targetCellValue)) Then
            turnCellCollection_tmp.Add Array(row, col)
            resultValue = checkReverse(row + range_value_row, col + range_value_col, range_value_row, range_value_col, False)
        End If
    Else
        '隣のマスではない場合
        If (turn = targetCellValue) Then
            '自分の石があったら、そこまでの石は裏返せる。(=挟んでいる状態)
            resultValue = True
        ElseIf (CELLKIND.NOPEACE = targetCellValue) Then
            '自分の石の前に何もないマスがあったら、裏返せない。
            resultValue = False
        Else
            '相手の石の場合は、さらに次のマスをチェック。
            turnCellCollection_tmp.Add Array(row, col)
            resultValue = checkReverse(row + range_value_row, col + range_value_col, range_value_row, range_value_col, False)
        End If
    End If
        
    checkReverse = resultValue
    Exit Function
    
checkReverseException:
    '「(board(row, col)の)インデックスが有効範囲にない」エラー。(一番端まで相手の石しか無い場合)。
    'その場合、もちろん裏返せない。
    If (INDEX_OUT_OF_RANGE = Err.Number) Then
        Debug.Print "abc"
        Err.Clear
        resultValue = False
    Else
        MsgBox Err.Number & " " & Err.Description
        resultValue = False
    End If
End Function

'勝敗判定
Public Sub judge()

    Dim count_sente As Integer, count_gote As Integer
    Dim strMessage As String
    
    turn = CELLKIND.GAME_END
    count_sente = countPeace(CELLKIND.SENTE)
    count_gote = countPeace(CELLKIND.GOTE)
    
    strMessage = "先手:" & count_sente & " 対  後手:" & count_gote & vbCrLf
    If (count_sente > count_gote) Then
        strMessage = strMessage & "先手の勝ち!"
    ElseIf (count_sente < count_gote) Then
        strMessage = strMessage & "後手の勝ち!"
    Else
        strMessage = strMessage & "引けわけです。"
    End If
    
    MsgBox strMessage, vbOKOnly + vbInformation, GAME_NAME
    Call writeText
    
End Sub

'tebanで指定された手番の石の数を調べる。
Private Function countPeace(ByVal teban As CELLKIND) As Integer

    Dim count As Integer, i As Integer, j As Integer
    count = 0
    
    For i = 1 To 8
        For j = 1 To 8
            If teban = board(i, j) Then
                count = count + 1
            End If
        Next
    Next
    
    countPeace = count

End Function

'盤を描画する。
Private Sub draw(ByVal row As Integer, col As Integer)
    
    If (CELLKIND.SENTE = board(row, col)) Then
        Sheets("Sheet1").Cells(row, col).Value = "○"
    ElseIf (CELLKIND.GOTE = board(row, col)) Then
        Sheets("Sheet1").Cells(row, col).Value = "●"
    Else
        Sheets("Sheet1").Cells(row, col).Value = ""
    End If

End Sub

'右フレームのテキストを描画する。
Public Sub writeText()

    If (CELLKIND.SENTE = turn) Then
        Range("J7").Value = "先手(白) の番です。"
    ElseIf (CELLKIND.GOTE = turn) Then
        Range("J7").Value = "後手(黒) の番です。"
    ElseIf (CELLKIND.GAME_END = turn) Then
        Range("J7").Value = "ゲーム終了!"
    End If
    
    Range("J3").Value = "先手(白): " & countPeace(CELLKIND.SENTE)
    Range("J4").Value = "後手(黒): " & countPeace(CELLKIND.GOTE)
    
End Sub

詰めが甘い部分もあるとは思いますが(特にcheckPutPeace()の一連の処理など)、ひとまずはこんな感じでしょうか。

http://ecx.images-amazon.com/images/I/51P83V533KL._SL75_.jpg
本格的に作るなら、こういう本で思考アルゴリズムとか勉強したら、もっと面白くなるんでしょうね。
(※上記のソースコードに、対CPU戦の機能はありません。)

【やってみた】1時間プログラミング

皆さんは、この動画を知っているでしょうか?

www.nicovideo.jp

IT系の書籍でもおなじみ、紀平拓男さんの動画で、タイトル通り「1時間以内にオセロをプログラミングしちゃおう」というものです。
一時期、IT系のニュースサイトなどでも話題になりました。

近頃は日経ソフトウェアの記事を読むたびに「ちょっとExcel VBAがおざなりになってるなあ…」と感じていたこともあったので、(無謀にも)リハビリがてら、これに挑戦してみました。

結果は…


テラ無理ゲー


確かに「石橋を叩きまくる」性格からか、決してプログラミングは早い方ではないとは自覚していましたが、流石に一時間は凄すぎます。
僕はというと、2時間でやっとそれっぽい動きをさせるのがやっとでした。(もちろんバグもある状態で)
しかも紀平さんは、環境設定(ブラウザインストールなど)からやってるし、HTML+JavaScriptで作成してたので、描画処理とかもやってるわけですから(僕はExcel VBAなので、オセロ盤の処理がJavaScriptより多少簡単に処理できる。)

いやホント、すごい人はいるもんだなあ、と実感しました。

でも、こういうすごい人がいるからこそ、刺激にもなるし勉強にもなるし、あと「○○では絶対に勝てないから、別で勝てるような事を身に付けなくちゃ」って思えるんですけどね。
それにこの業界は、面白い技術が次から次に生まれますし。

ホント、この業界を選んで良かった、って思います。
まあ「理系の大学に行って、本格的にITとか技術系の勉強をしとけばよかった」ってのは、今でも思いますけどね。

以上、本格的にITに触れたのは社会人になってからの、(遊べない文学部出身の)文系エンジニアの願望でした。


※おまけ
f:id:Makky12:20161011212933p:plain
結局3時間以上かかりましたが、ちゃんと最後まで完成させました。
ソースコードは後日アップロードしようと思います。)

フリーになる時に必要な手続き その2

というわけで、前回の続きです。

 

4.専用の口座&クレジットカード

これは「必須」ってわけではないですが、あったほうがいいと思います。帳簿をつける以上、仕事に関する事のお金の出入りはしっかり管理しないといけないですし、その際にプライベートの口座と一緒だと、ごっちゃになって管理がしにくくなりますし。

また万が一、確定申告で通帳しか証拠がない…なんて時に、プライベートの口座と一緒だと、あんな事やこんな事での利用歴を見せるハメに…なんてことも、無いとは言い切れない(?)ですし。

 

あと、そういう意味でも事業専用のクレジットカードも作っておいたほうが良いと思います。それに経費って結構出費が大きいので、どうせならこの機会にポイントとかマイレージとかのサービスが充実したものに加入するのが良いかも、って思ってます。

そうそう、フリーランス系のサイトでもよく書かれていますが「サラリーマンより審査が厳しい」みたいな話もよく聞きますので、できれば退職前に申し込んでおくのをオススメします。

 

5.その他

「その他」なんてくくってしまいましたが、要は「開業に必要なもの」です。例えば名刺とか印鑑とか必要でしょうし、あと文房具とか事務用品とか、人によっては業務専用のスマホ、それに専用の有料アプリも必要だったりしますので、それらひっくるめてって感じです。

ちなみに(僕はやっていませんが)20万以上の開業費は減価償却みたいな感じで「毎年分割で経費にする」事も出来るみたいです。

※ただし、商品の仕入れ代金や10万以上の機器、機材は「開業費」には出来ません(「資産」になる)。要は、10万以上のPCは「開業費」として一括経費にする、なんていうことは出来ないわけです。ちょっと残念(?)

※僕も勘違いしてたのですが、開業届の「開業日」前にかかった費用も「開業費」やその他諸々の「経費」に出来ます。なので、退職した翌日からのレシートや領収書はしっかり保存しておくことをオススメします。

 

とりあえずこんなところですか。

僕もまだまだ駆け出しなので、これから気になった事はいろいろ書いていこうと思います。

フリーになる時に必要な手続き

さて、一応本格的にフリーランスとしてスタートを切りました。(と言ってもまだ1週間なので、何とも言えませんが)
ただ今のところは、前みたいな人間関係のトラブルはなく、むしろ人間関係は良い感じです。

さて、僕も開業前には色々調べたり手続きをしましたが、フリーになる時に必要な手続きって何だろう?って思ったので、簡単にまとめてみました。
勘違いがあるかもしれませんが、参考程度に。


1.開業届の提出
まあ、まずはこれをしないと始まりません。
というか、とりあえずこれだけ提出しておけば、法律的にはフリー(というか、事業主)と認められます。

そうそう、「屋号」は無くても良いので「いい屋号が浮かばない…」っていう場合は、とりあえず屋号なしでもOKです。(ブランディングとか認知度のことを考えたら、あるに越したことはないですが。)
あと「業種」ですが、これ一つだけで個人事業税が課税されるかどうかや税率が変わるので、複数の業務を行う際は慎重に選択しましょう。(もちろん、ウソを付くのはダメですが。)

2.青色申告承認申請書の提出
フリーランス」でググると、大抵出てくる言葉ですよね。簡単に言えば「白色申告よりも詳細に申告するから、控除額(=非課税額)を65万円増やして下さい」という申請用紙です。
これ、始めは「記帳が大変そう…」とか「複式簿記って難しそう…」って思いましたが、実際にやり始めてみて分かりました。

これは絶対に申請した方がいいです。

いや、やってみて分かったんですが、複式簿記とか仕訳って、思ったほど難しくないです。
もちろん自営で店舗などを経営する人はすごい複雑なんでしょうが、僕のような常駐型フリーエンジニアの場合、基本的に

  • 収入…毎月の契約金
  • 支出(経費)…通勤代&車・ガソリン代

くらいで、あとはほとんど文房具とか技術関連の書籍とか、細々とした経費くらいでしょうし、それなら一度仕訳パターンを覚えてしまえば、1日10数分で記帳が完了すると思います。
それに最近は「freee」とか「MFクラウド確定申告」のような、安くて非常に便利な会計ソフトもたくさんありますので、知識が乏しくても何とかなるでしょうし、それで控除額が65万円増えるなら、絶対そのほうが良いと思います。

3.国民健康保険国民年金
会社員と違い、フリーだと会社の社会保険や厚生年金には入れないので、国民健康保険国民年金に加入することになります。(ただし退職後2年までなら前の会社のものに継続して加入出来ます。)

ただ、これが結構な額なんですよ…会社員って優遇されていたんだな、って実感します。(会社員は会社が半額負担してくれるから)
まあ一応、国民健康保険は「親などの扶養に入る」、国民年金は「減免申請をする」事で、減免される可能性はあります。
※ただ、普通は「開業する=満足に働ける」状態だと思うので、難しいとは思います。逆に病気や怪我などで「働き無くても働けない」人は、絶対に申請すべきだと思います。

…ちょっと長くなりそうなので、次回はまた後日。

フリーエンジニアになりました その2

また日付が空いてしまいました。すいません。

色々あって、なかなかパソコンに触れませんでした…

 

で、前回の続きなんですが、ニコニコ動画を見ていたら、こんな記事が。

news.nicovideo.jp

もちろん僕は学生ではないんですが、心当たりが無いわけではないんです。

実は闘病中、医師の勧めで発達障害とかアスペルガーに関する検査を受けたことはあるんですが、結果がかなり少数派というか、人とはかなり違っていて、それ以降、医師やカウンセラーの言葉に「個性だから」という言葉が明らかに増えたような気がします。(ただ僕の場合、コミュ障なんてことはなく、むしろ「よく喋るエンジニア」と言われることがほとんどですが…)

 

ただ、その「個性」ってのが理解されなくて、苦労した事は決して少なくないです。間違いなく求められた以上の成果を残しているのに、無理やり理由をつけて色々言われたり、最悪クビにされたり。

でも自分を認めてくれた会社では高い評価も頂いたし、自分も頑張れたので、これまで何とか会社員を続けてきたのですが、今回の件で完全に「会社は社員なんか守ってくれない」って思ったわけです。それで完全にフリーになる決心がつきました。「会社に依存する生き方は自分には無理だ!」って。

 

ただ先程「フリーになる決心」と書いたのですが、前回も書いた通り「フリーになってでも働いて食べていかなきゃいけない」のもまた事実なわけで。

こういう「(コミュ障など)病気や個性の件でうまく働けない」などのネットニュースを見ると大抵「だからニートなんだよ」とか「人生詰んだ」とか書いてあるけど、それは全くのお門違い。大変だろうし、つらいのも分かるけど、だからって「働かない理由」にはならないし、学齢期を過ぎた以上、普通は何かしら働いて収入を得ないといけないわけで(もちろん、医者が終了禁止するレベルの病気などは別として。)。

 

実際僕も生きづらさを感じてはいるけど、絶対そんな事は言いたくない。むしろ働き盛りの30代にほとんど働けなかった分を今から取り戻したい、という気持ちが非常に強い。間違いなく闘病中だった10年前より、気持ちはむしろ若いと思う。

でも、残念ながら、世間というのはそんなに甘くないし、病気が治ったからって「8年間の病気」の事がチャラになるわけじゃない。でも何とかして働いて食べていかないといけない。これは紛れもない現実。

じゃあどうするか、といったら「そんな事が関係ない方法で生きていけばいいだけじゃないか」という結果に至ったわけです。まあ、そうしないと食べていけないわけですし。「こち亀」の両さんの言葉を借りれば「生きるか死ぬかではなく、どう生きるか」ってやつです。

 

なんかフリーエンジニアになったってことを軽く書くつもりが、やけに重い内容になってしまいましたね…次はもっと軽い感じの事を書こうと思います。