echo("備忘録");

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

フリーになって1ヶ月経った感想

手塚規雄さんが、Twitterでこんなつぶやきをしていた。

面白そうだったので、僕もやってみました。
https://shindanmaker.com/568560

その結果がこちら。
これを見てくれ。こいつをどう思う?

おそらく、以前(というか、闘病中で文字通り「一寸先が闇」だった頃)だったら、何が何でも飛びついたと思います。
ただ、病気から回復して、こうしてフリーとして生きている今の自分なら、間違いなく断ります。

なぜかって?

だって、基本給46万ってことは、大雑把に考えて、手取り40万弱ですよ?
って事は残業代含め、まあ良くて45~50万ってとこですよね?
しかも月50時間の残業は確定です。(まあ「男性が多い」ってのは、「一生この業界で食べていく」と決心した時点で諦めてます。)

そんなの、どう考えても割に合わないですもん。
フリーなら残業ゼロでも、基本給+10~15万くらいは堅いですし。(東京ならもっと多いと思います)

そりゃ退職金とか老後の生活とか福利厚生とかありますが、よく考えたら

  • 退職金:今はない企業も多い。というか退職まで生きている保証なんて無いから、それなら生きてるうちに多く貰って、自分で蓄えたい。
  • 老後の生活:これも退職金と同じで、死んだらもそうだけど、そもそも会社に何かあったら終わりだし。
  • 福利厚生:よく考えたら、福利厚生って、言うほど世話になったことがないや。

まあ簡単に言えば「自分の事は全部自分で責任持つから、その分時間やお金や自由がたくさんある働き方をすべきだ」ってのが、僕がフリーになった理由でもあるわけです。

実際、フリーになって1ヶ月経ちましたが、別にそういった面での大変さはそれほど感じていません。(むしろ「何から何まで、全部自分の責任でやっているんだ」という満足感のほうが大きいです。)

(僕みたいな)そういう「自分の事は、全部自分が責任を持たないと」というような考えの人には、フリーという働き方はお勧めだと思います。

逆に「そんなの面倒くさい」とか「そんなの誰かがやってくれるよ」って人は、フリーになるのはやめたほうが良いです。多分身が持ちません。
(あと「業務時間外では自分の業務関連の事に1ミリも関わらない」という人も、フリーには不向きだと思います。やっぱりどんな形でも、スキルアップは必要です。僕もフリーになってから、何かしら勉強する時間が大幅に増えました。)

まあ、僕のように人生波乱万丈で「フリーしか生きていく道がなかった」場合は別としても、そういう「自分の事は、全部自分が責任を持たないと」みたいな人は、一度フリーを検討するのも、決して悪くないと思いますよ。
(逆に言えば、そんな僕でもやっていけるのですから、決して選択肢としては悪くないと思います。)

…少なくとも、会社(特にブラック企業)に飼い殺しにされて、最悪な事態になる前に。

ASP.netの「依存関係エラー」でエラーになる時

昨日、フリー生活初の「請求処理」を行いました。
やはり「請求処理」みたいな事を自分で行うと「俺、本当にフリーでやっているんだなあ」って実感します。
今月は1ヶ月フルで働いてないので(途中からスタートしたから)満額もらえるわけではないですが、それでも報酬が振り込まれたら、嬉しいんでしょうね。

…しかし、支払サイトって、何であんなに長いんでしょう?もっと短くして
(金欠なので…)
あと、どんなに切羽詰まった状況でも、契約内容は妥協してはダメですよ。
(内税/外税の違いだけでも、割と大きな差ですから…)

就業先は変わりたくないけど、エージェントだけ、もっと良い所に変われないかなあ…


とまあ、そんなことは置いといて…

さて、今の就業先ではチームで作業をしておりまして、当然Visual Studioのプロジェクトもチームで共有しております。
で、何かMS側のトラブルか何かで、長いことチーム開発の参加申請ができなかったのですが、ようやく申請が可能になり、承認もおりました。
で、早速プロジェクトをチェックアウトして、デバッグを走らせたら…

f:id:Makky12:20161027215301j:plain

なんですと?

当然、他の人のところでは問題なく動いてるから、ソースに大きな不具合が…とは考えにくい。
それに、事前に指定された環境構築作業はすべてやっているから、そこら辺は問題ないはず。

てことは、単純に僕のPC環境とか、それとも就業先での「暗黙の了解」みたいなことをまだやってないとか、そういうこと?

…とか思ってましたが、なんてことは無い、ググったら普通にありました。
https://www.ipentec.com/document/document.aspx?page=visual-studio-2015-asp-net-runtime-error-in-64bit

要は「IIS Expressがデフォルトで32bitだから、64bitバイナリは動かせません」ということですね。
…こういう所って、Visual Studio側で事前に判断してくれると嬉しかったり。

というか、以前もこういうエラーに直面して、そのときも確か32bitと64bitの違いが原因だった事を思いました。(そういう事こそ、しっかり覚えておけよ、と。)

…ていうか「てっきり就業先では必要なことをやってないだけ」と判断して、他の方の時間も使ってしまいました。反省です。
そういう事は、自分でちゃんとやるべき事をやってから聞かないといけませんね。

という訳で、今後は十分気をつけなくては、と思いました。

Xamarinの導入 その2(コーディング)

前回、エラー出まくりながらもXamarinの環境構築が何とか完了しました。
PCLはまだまだ問題ありですが、Android単体なら何とかなりそうなので、下記のサイトを参照して、Android用の簡単なサンプルを作成してみました。
sys-guard.com

まずはVSを起動して、プロジェクトから[Visual C#]]-[Android]-[Blank App(Android)]を選択。
現在Android(というかJava)を絶賛勉強中ということもあり、とりあえずソースはAndroid Studioで作成したものをそのままコピペして、いきなりビルド。

こいつ…動かないぞ!(当たり前)

まあ、そのままでは動きませんので、修正を。
とはいえ、まだまだソースの細かい部分を一から説明すると大変なので、現時点ではとりあえず感じたことを。

  • 基本的なクラスとかコントロールは、デフォルトでインポートされてるもので大丈夫っぽい。(今回個別に追加したのは「Android.Graphics」のみです。またヒントに結構「この名前空間のこのクラスを使え」って直に表示されます。)
  • プロパティ・メソッド名は同じものが多く、せいぜい大文字・小文字の違いのみ。(マウスオーバーで提示される修正で、大半のエラーは直りました。)
  • イベントリスナーとか、ダイアログとかの固定処理(onCreateDialog()など)が、ちょっとだけ違う(まあ、ここは慣れ…なのかな?)

※先程のSYSTEM GUARDIANさんのページとか、https://developer.xamarin.com/api/root/MonoAndroid-lib/さんなんかが参考になると思います。

もちろんJavaとXamarinの違いに苦戦はしましたが、何とかビルドも通り、実行。
f:id:Makky12:20161022224054j:plain
こんな感じでボタンが表示されて、クリックすると…(しかし「ここをクリック」って、1クリック詐欺かよ…)

f:id:Makky12:20161022224102j:plain
ちゃんとメッセージボックスが表示されました。

というわけで、とりあえずAndroid単体なら、何とかなりそうですね。(iOSも試せれば良いんですが…Mac購入の日は遠い)

今後は、もっと突っ込んだ所に手を出せるといいなあ。
まあ、まずはAndroid(というかJava)の勉強が先ですね。

※おまけ
・先述のSYSTEM GUARDIANさんのページにもありますが、ちゃんとGUIデザインも出来るみたいです。(Android SDKが古かったらしく、実行できなかった。)

・「フレームがモジュールにありません」と表示され、ステップ実行が出来ませんでした。実機デバッグだとこうなるんでしょうか。
あ、PCがヘボいから?(もう6年前のPCですから…報酬入ったら、DELL通販あたりで買うかな…)


あと、最後にソースコードを。

using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;

using Android.Graphics;

namespace AndroidApp
{
    [Activity(Label = "AndroidApp", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity, View.IOnClickListener
    {
        private readonly int WC = LinearLayout.LayoutParams.WrapContent;
        private readonly String TAG_MESSAGE = "0";
        private readonly String TAG_YESNO = "1";
        private readonly String TAG_TEXT = "2";
        private readonly String TAG_IMAGE = "3";

        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            RequestWindowFeature(WindowFeatures.NoTitle);

            LinearLayout layout = new LinearLayout(this);
            layout.SetBackgroundColor(Color.White);
            layout.Orientation = Orientation.Vertical;
            SetContentView(layout);

            layout.AddView(makeButton("ここをクリック!", TAG_MESSAGE));
        }

        private Button makeButton(String text, String tag)
        {
            Button button = new Button(this);
            button.SetText(text, TextView.BufferType.Normal);
            button.Tag = tag;
            button.SetOnClickListener(this);
            button.LayoutParameters = new LinearLayout.LayoutParams(WC, WC);

            return button;
        }

        void View.IOnClickListener.OnClick(View view)
        {
            String tag = (String)view.Tag;

            if (this.TAG_MESSAGE.Equals(tag))
            {
                MessageDialog.show(this, "メッセージボックス", "Hello World!");
            }
            else
            {
                return;
            }
        }

        public class MessageDialog : DialogFragment, IDialogInterfaceOnClickListener
        {
            public override Dialog OnCreateDialog(Bundle bundle)
            {
                var ad = new AlertDialog.Builder(this.Activity);
                ad.SetTitle(this.Arguments.GetString("title"));
                ad.SetMessage(this.Arguments.GetString("text"));
                ad.SetPositiveButton("OK", this);

                return ad.Create();
            }

            public static void show(Activity activity, String title, String text)
            {
                MessageDialog f = new MessageDialog();
                Bundle args = new Bundle();
                args.PutString("title", title);
                args.PutString("text", text);
                f.Arguments = args;

                f.Show(activity.FragmentManager, "messageDialog");
            }

            void IDialogInterfaceOnClickListener.OnClick(IDialogInterface dialog, int which)
            {
                // throw new NotImplementedException();
            }
        }
    }
}

VB6からVB.netに移植する際の注意点

なんか最近、急に感じるようになったんですが、1週間ってこんなにしんどかったっけ?
いや「精神的」になら、発病時&闘病中は死ぬほど感じてましたが、そうではなくて「肉体的」になんです。(むしろ精神的には、特に問題ないです。)

…単純に、年なんですかね。
あ~ヤダヤダ。(若いっていいなあ。)

とまあ、アラフォーおっさんの愚痴はこれぐらいにして、と。

今日「VB6のプログラムをVB.netに移植する」という業務があったんですが、そこでちょっとハマったので、備忘録的にメモ。

1.StrConv()関数
VB6の「StrConv()」関数の第2引数には色々引数を指定できますが、VB6の「vbFromUnicode」はVB.netでは使えなくなっています。
https://msdn.microsoft.com/ja-jp/library/cc437757(v=vs.71).aspx

じゃあどうやるのかと言えば、System.Text名前空間の「Encoding」クラスを使って、まずByte型の配列にして、(日本語を扱いたい場合、先にGetEncoding()メソッドでシフトJIS対応のEncodingオブジェクトを取得する必要がある。)

Dim mojiretu_string As String = "あいうえお"
Dim mojiretu_byte As Byte()
mojiretu_byte  = System.Text.Encoding.GetEncoding("Shift_JIS").GetBytes(mojiretu)

それからGetString()関数を使って、文字列に戻してあげればOK。

Dim mojiretu_moto As String = ""
mojiretu_moto  = System.Text.Encoding.GetEncoding("Shift_JIS").GetString(mojiretu_byte)

2.配列の扱い
移植対象のソースの中に、こんな処理があって、

Dim hairetsu(5) As string, max_index As integer
max_index = UBound(hairetsu)
Redim preserve hairetsu(10)

VB.netは配列のインデックスは0始まり固定って事は、他の言語(C#とかJavaとか)と共通になったんだから、max_indexは4だな。」って感じでソースを修正してたんですが…
いざデバッグすると、何度やっても、何をやっても期待した動きをしない。

最初、何が原因か分からず、結構ハマってたんですが…
まあ、原因は言うまでもなく「UBound(hairetsu)」の値です。

他のほとんどの言語(C#とかJavaとか)だと、例えば「hairetsu(5)」って定義したら、

hairetsu(0)~hairetsu(4)の5個の要素が作成される。

ですが、VB6では

hairetsu(0)~hairetsu(5)の6個の要素が作成される。

んです。

で、VB.netはというと、VB6の仕様を継承しています。(多分、互換性の関係なんでしょうね。)
だから、max_indexは「4」ではなく「5」なんです。

…という「VBC#は似てるっていうけど、過信すると痛い目にあうよ」というお話でした。

※ちなみに、VB独自の仕様に関係ないソースにするならば、配列の「length」プロパティを使い、

max_index = hairetsu.length - 1

とすべきです。

これなら、hairetsu(5)の場合

VB.netの場合:要素は6つ → hairetsu.length - 1 = 5 ← OK!
他の言語の場合:要素は5つ → hairetsu.length - 1 = 4 ← OK!

となり、どちらの場合も正常に動作します。
(極力.netや他の言語と共通のコードにしたほうが無難、ってことでしょうね。)

前のXamarinの導入でも「VBは独自で、C#とかに慣れてると難しい」って書きましたが、まさにこういう所が難しいんですよねえ…
(この件について、Twitterなどで結構反響がありました。ありがとうございます。)

【解いてみた】平成28年度秋期 応用情報技術者試験午後問題 問3(プログラミング)

まずは前回の修正。
「選択問題をどれに…」なんて書きましたが、諸事情により、応用情報シリーズは今回で最後にします。(まあ、こんなのがあと4回も続いても…って感じもしますし。)

という訳で、早くも最終回の今回は「プログラミング」です。
「魔法陣」に関するプログラム(というかアルゴリズム)ですね。

回答
※N^Xとは「NのX乗」という意味です

1.N^3

2-(1)
 イ:houjin[y][N+1]
 ウ:houjin[N+1][x]
 エ:(N+1) / 2
 オ:N^2未満である
 カ:yb-1
 キ:xb
2-(2)
 houjin[1][N+1] と houjin[N+1][1]

3.ク:N
  ケ:1

こんなところですかね。

個人的には、難易度は前回同様、あるいはそれよりもやや簡単といった感じで、今年はプログラミング問題の難易度は低めでしたね。
その分、来年は難易度が上がるかもしれませんね。

あと、個人的には今回の「地雷」はシステム開発技術な感じがするのですが、どうなんでしょうね。(僕がモジュール結合分野の勉強をサボってただけ?)

【解いてみた】平成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にマウオーバーすれば、パスが表示されます。