潜伏バグからのロングフリーズ

Javaっぽいエンジニアの徒然草

ギークスジョブに登録しようとしたら、とあるドラマが展開された件

このラノベ感漂うタイトル。

どうも。フリーランスとなったモノクロタマゴです。

 

この記事を書いている段階では、下記3つのサイトに登録しています。

  1. クラウドワークス
  2. ランサーズ
  3. ギークスジョブ

 

今回は、つい先ほどギークスジョブに登録しようとしたときのお話です。

※1に関しては後日記事を書こうと考えていますが、2は登録だけして使ってないので記事書くことは多分ありません。

 

続きを読む

開業届と青色申告は意外にも簡単だった

先日、最寄りの税務署に出向き「開業届」と「青色申告」を出してきました。

晴れてフリーランス化したわけですが、その話は置いておいて・・・

面倒くさそうな印象しかなかった税務署手続きが、意外にも短時間で済んだという些細なお話になります。

 

【持って行ったもの】

 ・ハンコ(シャチハタではない普通のハンコ)

 ・マイナンバーカード

マイナンバー導入後は記載欄が追加されているようですので、お忘れなく。

 

【税務署でもらったもの】

 ・開業届の申請用紙

 ・青色申告の申請用紙

これらは事前にネットからDLすることが可能です。

家で書いて郵送する人が多いと思われますが、プリンタが無かったので税務署で貰いました。もちろん、コンビニで印刷することも可能なのですが、いまいち書き方が分からないところがあったので現地で聞きながら書いたほうが楽だったのです。

 

開業届の職業欄に書く内容で、個人事業税の課税対象となるか否かが変わるようです。

私はそのまま「システムエンジニア」と書きましたが、課税対象となったりならなかったりするらしいですね。なんとも曖昧な・・・。まるで型宣言のいらないPHPみたいです。

 

【税務署での手続き】

 1.受付にて「開業届」と「青色申告」を提出したいので用紙をくださいと伝える

 2.不明点を職員さんに尋ねつつ記入する

 3.提出する

 4.職員さんが押印し、控え用紙をもらって終わり

たったこれだけ。10分程度で終わりました。

 

後日、郵送にて何か届くらしいですが、とりあえずの手続きは終わりとのことで帰宅。

 

税務署というと、

 ・なんだか怖いイメージ

 ・手続きに時間がかかるイメージ

でしたが、特段そんなことはなかったです。

 

フリーランス化する方は、申請をお忘れなく。

デブサミ2017いってきた

f:id:monokurotamago:20170222221542p:plain

f:id:monokurotamago:20170216143921j:plain

 

先週、デブサミ2017に参加してきました。

一部公演について、メモした内容を記載しておきます。

メモの内容に誤りがあったらごめんなさい(> <)

 

codezineさんがまとめ作っているので、詳しくはこちらを参照すると間違いないよ!

http://codezine.jp/article/detail/9999

 

 

----------ここからメモ------------ 

1日目15:15~16:00
【16-B-5】
AI礼賛時代にエンジニアはいかにしてサバイブすべきか

f:id:monokurotamago:20170216151534j:plain


資料
https://speakerdeck.com/rindai87/how-should-engineers-survive-during-ai-era

 

ここ1年でいっきに人工知能ブームがきた。

人工知能やりたまえという謎のプレッシャー。


人工知能機械学習の手法を知りたい
ブラックボックスのままAPIのコールすればOK → つまらない
チートシートを活用して適切なアルゴリズムを選択すればOK → つまらない
WEB上で色々なアルゴリズムをシミュレート playground.tensorflow.org
機械学習っぽくなったけど難易度高いよ・・・

 

ある程度機械学習やりたいなら数学の知識は必要
特に線形代数微分は必要。

機械学習のポイント抑えたいなら「ゼロから作るDeep Learning」という本オススメ。

 

・実際にキャリアにどんな風に関わるの?
話の前提
 ・人工的なものをプロジェクトとして考える
 ・なんでもできるスーパーマンがいない状態
 ・事業会社に中で完結していないケース

人工知能に取り組む目的
 ・コスト削減
 ・品質の均一化
 ・既存サービスの強化
 ・新規事業の創出

 

人工知能は過度な期待が寄せられがち
→ 経験がないなら計画は小さく

 

人工知能的なアプローチはやってみなければわからないので、実証実験から始めることが多い。

「このデータを使うと、何ができるか」を最初に見る
手持ちのデータややりたいことから、何ができるかを実証実験。

入口「データ」 → 人工知能 → 出口「アプリケーション」

データサイエンティストとエンジニアの両方と会話ができる取りまとめ役がいないとプロジェクト進行に難あり。
→作るものがブレてしまう。

 

人工知能機械学習は、一度作ったらしばらく使えるというものではない。
得られるデータが変わっていくため、定期的なモデルのメンテナンスが必要。

今の人工知能は、最初の設計から逸脱したものを追随できるほど汎用的なものではない。

分析モデルが目に見えないものであるため、お客様との信頼関係が超重要。


新しい論文や理論が次々出るので、ツールやライブラリで提供されるのをまっていてはおいつけない。
自分で環境構築してできる人が必要。

ビジネスとしてやりたいこと、AIでできること、それをプロダクトとして提供できる人。

機械学習はCPUではなくGPUで処理するとすごく早い。

 

 

1日目16:20~17:05

【16-B-6】
ユーザ事例と開発手法の二本立て!毎月3万チケットが登録されるRedmine運用と今どきのRubyによるアジャイル開発手法

 

前半戦

REDMINEつかったことあるひとー? 大半挙手
全社的にREDMINEいれてるところー? ちらほら

 

REDMINE導入前はエクセル使ってました。

プロジェクト管理の標準ツールとしてREDMINEを2015年4月に導入しました。

導入の狙いは・・・
プロジェクト状況の見える化

ヒアリングして改善のためプラグイン作りましたーという話。
具体的な話がなかった・・・


後半戦

Lychee Redmine

 → ぱっと見凄く使いやすそう。

   全部JS制御でドラッグドロップでポチポチできる。

 

専任テスターを設けて、テストコードのわかりやすさで実装コードの質をはかっている。
プラグインのフロントには、backborn.jsやreactを使っているとのこと。
チームプレーで品質を高めて効率を図る、これ大事。

 

 

1日目17:25~18:45
【16-C-7】
「ITエンジニアに読んでほしい!技術書・ビジネス書大賞 2017」プレゼン大会

 

技術書部門

■ゼロから作るDeep Learning
Pythonでライブラリ使わずに自作する本。B-5セッションでオススメされてたやつ。
・作る経験 ・動かす発見 ・分かる喜び
自分で作る〜

■暗号技術入門第3版
難しい数式つかわない、図形も簡略に、内容は最新のものをモットーに作成。
数学やコンピューターの知識が前提になっていないので、誰でも理解できるように書いた。

■達人プログラマ
1999年に書かれた本。ピアソンが技術書撤退したから代わりにオーム社から。
レビュー入っているのでピアソン版とは訳が異なる箇所あって、比較すると面白いかも。
昔に書かれた本なので、今の内容とはマッチしていない箇所があるけど、本質的には良い内容。
→ 古典と思うと良さそう。


ビジネス書部門

■なぜあなたの仕事が終わらないのか
中島さんの時間術がすごいと思ったきっかけ → 技評の記事。
記事の内容を編集者が1ヶ月試した結果、仕事が進んだので執筆のオファーを出した。
仕事に追われる毎日 → 土日に休めるようになる → 半年の休みがとれる
ように編集者さんはなったらしい。

まずは雑務を終わらせる → そしたら大事な仕事に集中できる


■ITエンジニアが覚えておきたい英語動詞30
英語が好きな人ー? → 1人だけ。英語嫌いな人にオススメの本です。
ITエンジニアは、名詞については普段から英語を使っているので、動詞を使えればそれっぽくできる。
アメリカの話。海外からくるエンジニアが多い。そこで会議するときに、どんな英語が使われるか。それをまとめたのがこの本。
海外からくるエンジニアは英語が得意なのではなく、エンジニアリングが得意なだけ。つまり、最低限のコミュニケーションがとれればOK
日本語と違って英語は動詞が大事。
TOEICの高得点ではなく、ミニマムな動詞力が求められている。とのこと。


■最強の働き方
・優先順位の高いことが凝縮されていること
・体系的になっていること
・面白いこと
執筆者が、世界中の上司から怒られた内容をまとめたもの。

 

 

2日目13:05~13:50
【17-A-3】
サーバレスにおける開発プロセス戦略

 

FaaSを使った開発を前提。
開発プロセスづくりの第一歩が目的。

 

サーバレスの開発に使われているツール
一位 Serverless Framework

 

苦労したところ

・Lambdaの導入事例が少なくて、本当に耐えられるか不安があった
・エラーログの解析のUIがわからなくてログ解析に手間取った

 → CloudWatch Logsを開発中はSlackに垂れ流す手がある
・ローカルでテストがしにくい。UTはできるけど通しテストができない。

 

UTどうやってる?
GitHubにプッシュするとUTが走る形でローカルにて実施している。

 S3とか絡むと難しいから、そこは実際にイベント流している。

 ビジネスロジックはLambdaやS3とは分離するように心がけている
・ローカルでUTを実行しているが、CIはできていない。

 関数単位で試験できるようにしておいて、全体はAPIつないで、INPUTとOUTPUTみる形でテストしている。

ステージ環境の管理どうやってる?
・使っていない。環境ごとのデプロイは別で管理させている。
・全環境ごとにプレフィクス使って管理している。数が増えてきたことと、デプロイミスがちょいちょい出てくるので自動化したい。
・使っていない。AWSのアカウントで開発環境と本番環境が分かれている形。
→ 今のところ3人ともステージ環境が必要とは思っていない模様

 

リリース管理どうやってる?
・基本的にはGitHubにプッシュしてCI回すかたち。小さい関数とかはzipに固めてUPしちゃうこともある。
・Gitでソース管理。関連ソースが同じツリーに入っているので、そこからビルドする。Jenkinsからキックしてビルド。
・自動デプロイはしていない。開発環境と本番でVPCが異なるので、環境毎に切り分けしているかたち。

 

サーバレスに向いてるシステムってどんなの?
・単純なサービス、開発体制でいうと少人数のもの
・時間かかるものは不向き。非同期処理は向いている
・イベント駆動で、必要な時にだけ動いて欲しい処理は向いている

 

 

2日目14:10~14:55
【17-A-4】
C#で簡単にモバイルアプリを作ろう!

 

VS 2017 3月7日にリリース。無料。

C#にはこんな機能あるよ
・多値戻り値 タプル
・コレクション操作 LINQ
・非同期処理 async/await
・型引数 ジェネリクス
・匿名関数 ラムダ式 など

 

VS2017によるライブコーディング
WEBからJSON引っ張ろうとしてA会場のWiFi問題

 

いろんなプラットフォームで動く
JavaJVM上で中間コードが実行される
C#は.NET環境があれば、同じように中間コードが実行される。
  Windowsなら .NET Framework
  Linux, Macなら Mono

 

Visual Studio for Mac無料です。

 

Xamarin (ざまりん)
C#だけで動かせるクロスプラットフォーム座間市のマスコットじゃないよ。

f:id:monokurotamago:20170222223647p:plain

iOSアプリもAndroidアプリも一つのもので作りたい → Xamarin
iOSアプリ、Androidアプリ、UWPアプリ 全てつくれます。
 ✴︎UWPアプリ→Windows phoneのやつ

Xamarinによるコード共有化は6割。全て共有できるわけではない。

WindowsiOSアプリ作りたい → XcodeにしかSDKおけないので、ホスト用のMac端末が必要
MacでUWPアプリ作りたい → Windowsないと無理

 

 

 

2日目15:15~16:00
【17-D-5】
エンジニアが起業するとき気を付けること

f:id:monokurotamago:20170217151604j:plain

 

起業=自由
遅刻ない、休日もない
残業がない会社にする自由 → ただし、最初から残業しないと決めておかないと難しい。
アーキテクチャもテクノロジも自分で全て決めれる。

 

一番大事なところ
開発費・運用費を初期費用・システム利用料に書き換える自由

 

ウォーターフォール
 開発費が最初にかかる、運用になると人が減るので後半は費用がかからない
 システムが稼働すると利益が伸び始め、収益が増える。
 大半のエンジニアは開発だけに携わるので、遅いだの高いだの文句言われるだけだが、その後は実はすごかったとなって継続する。

 

増員
優秀な人から採用されるので、人数が増えると追加ひとりあたりの生産性が低くなる。

アジャイルでやるとそういうことがない。

 

主要な顧客の近くにオフィスを構えている。4分以内。
→ 営業が苦手なので、何かあったらすぐ行きますという風に対処してます

 

エンジニアが起業する時に気をつけること
なんでも本当に自由です。
契約も自由です。

開発費 → 初期費用
運用費 → システム利用料

このように書き換えるだけで「働いたからお金をもらう」という考え方から「システムを作って、それが稼働しているから収益の一部をもらっている」という考え方

にシフトできる。

 

 

 

2日目16:20~17:05
【17-A-6】
ニコニコ動画・生放送の配信基盤刷新

f:id:monokurotamago:20170217162144j:plain

 

動画数1420万、生放送数2.9億
最初に作られた(10年前)ころの想定からは規模が大きくなりすぎた

スマホの台頭により利用環境が変化、デームデバイスでも視聴可能。

ブラウザの話では、Flashの時代からHTML5の時代へ。

ニコニコも2016年末〜2017年1月にかけて、フラッシュからHTML5にかわった。

 

新たに配信基盤を作りました。

f:id:monokurotamago:20170222224145p:plain

dwango media cluster (DMC)

本邦初公開!

DMCの利用言語は Erlang, C/C++, Rustの3つです。
使い分けは?

 ・Erlang

  映像の送受信、中継、ストレージ、負荷状況のモニタリング、API応答処理、ようするにほとんど全てこれメイン。ただし、速度ではC, Rustに劣ります。

 ・C/C++

  映像のトランスコードに使ってます。速度大事。

 ・Rust

  分散ファイルシステムに使ってます。別にこれじゃなくても良かったけど、ぶっちゃけ使ってみたかっただけです。

 

動画毎に、高画質、中画質、低画質、高音質、中音質、低音質の組み合わせ9パターン用意していたが、容量食い過ぎ・・・
→ 画質と音質を組み合わせることで、6パターンで再現


性能と上長度を担保しつつ容量効率を満たすため、Rustで独自の分散ファイルシステムを作った。

 

----------ここまでメモ------------

 

 

感想とかとか。

 

東京に住んでた時には特に意識してませんでしたが、地方民となった今では改めて「関東圏はIT関連に恵まれているなぁ」と思わざるを得ません。

電車賃数百円払えば会場に行けるなんて素晴らしいです。

 

前置きはこの辺にしまして、ここ4、5年は毎年デブサミに参加しているのですが、今回初めて「技術書・ビジネス書大賞」を受講しました。

デブサミ講演者はスライドの作り方や話し方が総じて上手だなぁと毎回感じていましたが、このセッションでプレゼンターを務めた6名は一段とレベルが高く、内容はしっかり伝わる中にユーモアがあり、是非本を読んでみたいと思わされました。

 

個人的にタイムリーな話題に関わるお話も聞けたりしましたが、その辺は割愛します。

 

帰り際には、様々なイベントでよくお見かけする "某有名な方" とお話させていただく機会もあり、有意義な時間を過ごすことができました。

 

最後に戦利品をパシャりと。

(注意:林檎マークは戦利品ではなく、ただの背景です)

f:id:monokurotamago:20170222223049j:plain

 

 

・・・・・・だらだら書いたら5000文字こえてました。

なげぇよw というツッコミはナシの方向で検討いただきたく。

地味に便利なOracle置換変数

PrimaryKeyが同じ複数のテーブルがあるときに、データを書き換えながら導通確認したい場面がありました。

 

例えばテーブル構成が以下のようなときに、

「TABLE_01.COL1がAの時の動作、Bの時の動作、Cの時の動作がみたいなぁ〜」

「TABLE_02.COL4がDの時の動作、Eの時の動作もみたいなぁ〜」

「確認したいレコードは1件だけじゃなくてたくさんあるなぁ〜」

という場面です。

 

TABLE_01

  KEY1

  KEY2

  COL1    (COLUMNのことです)

  COL2

  COL3

 

TABLE_02

  KEY1

  KEY2

  COL4

  COL5 

 

以下、SQL Developerでの作業メモです。

 

普通にやると、

--現在の値確認用SQL

select * from TABLE_01 where KEY1='xxx' and KEY2='yyy';

 

--TABLE_01のデータ更新用SQL

update TABLE_01 set COL1='A' where KEY1='xxx' and KEY2='yyy';

 

--TABLE_02のデータ更新用SQL

update TABLE_02 set COL4='D' where KEY1='xxx' and KEY2='yyy'; 

 

などなど書いて、COL1をCOL2に書き換えたり、'A'を'B'に書き換えたりしながら

ゴリゴリやるわけです。

書き換える箇所が多くて面倒です。

 

■そんなあなたにDEFINEコマンド

置換変数を事前に定義して値を設定することができます。

設定した変数は、スクリプトの中で繰り返し使用できます。

 

Oracleの置換変数って?

アンパサンド2つの後ろに変数名を定義 -> 永続変数 (ex. &&value)

アンパサンド1つの後ろに変数名を定義 -> 一時変数 (ex. &value)

 

■例

DEFINE key1 = 'xxx';

DEFINE key2 = 'yyy';

変数key1に'xxx'という文字列、key2に'yyy'という文字列をセットしました。

セットした内容は、一般的にはDEFINEコマンドで確認するようです。

DEFINE;

実行すると定義された変数の一覧が表示されます。

が、個人的には不要な変数までズラズラ出てくるのが邪魔なので、

select &key1, &key2 from dual; 

のように確認しています。 

自分で定義したやつだけ見れればいいんです。

 

以上の内容をまとめて、最初に書いたものを書き換えてみます。

-- 別のkeyのデータを扱う場合はここを1回実行して変数を書き換えます

DEFINE key1 = 'xxx';

DEFINE key2 = 'yyy';

select &key1, &key2 from dual;

 

-- 現在の値確認用SQL

select * from TABLE_01 where KEY1 = &key1 and KEY2 = &key2;

 

-- TABLE_01のデータ更新用SQL

update TABLE_01 set COL1='A' where KEY1 = &key1 and KEY2 = &key2;

 

--TABLE_02のデータ更新用SQL

update TABLE_02 set COL4='D' where KEY1 = &key1 and KEY2 = &key2;

 

こんなスクリプトになりました。

COL1とかCOL4とかは直接書いたほうが分かりやすいのでそのままにしています。

元のコードでは各SQLのwhereのkeyを合計6箇所書き換える必要がありましたが、

新しいコードではDEFINEの2箇所を書き換えて実行するだけになりました。

 

以上、地味に便利なOracle置換変数の利用方法でした。

 

---------

ここで書いたのはあくまで我流なので、本来の使い方はグーグル先生に聞いてください

三種のDiff器

このエントリ記事はDevLOVE Advent Calendar 2015 「Diff」14日目の記事です。

 

■自己紹介

@monokuro_tamagoと申します。

恐らく大半の方が初めましてになるかと思います。

数ヶ月前まで首都圏でSEをやっていましたが、現在は転職し活動の場を九州に移しました。場所は変わってもSEであることには変わりありません。現在は公共機関向け大規模システムのサブシステムを担当し、要件を噛み砕いて設計〜テストまでやっています。

テーマが「Diff」ということで、日本神話の三種の神器をもじって「三種のDiff器」というタイトルをつけましたが、中身は天叢雲剣などとは一切関係ございません。あしからず。

 

■第一のDiff「外部勉強会への参加」

DevLOVEのイベントに初めて参加したのは、DevLOVE現場甲子園2013でした。

当時、会社の上司から外の勉強会へ参加することを強く推されて(半ば強制的な圧力もあり)、何か無いかな〜と探して見つけたイベントでした。

外部の勉強会参加はこれが2回目であり、どういう風に参加すれば良いかまだ分かっていない状態でしたが、会場の熱気をビシビシと肌で感じたのを今でも覚えています。

 外に出て分かった事は、開発の現場が活気に満ちているということでした。社内に閉じこもって日々の業務をこなしているだけでは知る事の出来ない世界がそこにはありました。開発現場特有の悩みを共有し、お互いに刺激し合って成長する。そういう場は理想郷でも何でもなく、目の前に実在していたのです。

 

■第二のDiff「社内勉強会の開催」

新入社員として入社後、上司との初めての面談時にこんなことを聞きました。

「社内で有志による勉強会はないんですか?」

答えは、

「以前はあったけど、いつの間にか自然消滅していた」

という残念なものでした。

当時の私は「それなら自分で開催してやろう」という気概は持ち合わせてはおらず、日々の業務をこなすだけの生活をしていました。

それから紆余曲折あり、モチベーションが上がったタイミングでちょくちょく外部勉強会への参加を経験し始めた頃、会社の先輩から「一緒に社内勉強会を開催しないか?」というありがたいお誘いをいただきました。

 殻に籠って自分から発信することのできなかった私にとって、それはまさに渡りに船でした。

その結果、GoFデザインパターン勉強会、Git勉強会、読書会など、幅広い内容で数年に渡って社内勉強会の実績をつくることができました。

 

■ 第三のDiff「マネージャへの転換」

 先述した通りつい最近転職を行いました。転職先ではマネージャとして期待されています。現在、とある筋から流れてきた情報を元に、水面下で新たな契約を取る動きをしています。契約が実れば、私をリーダーとしてチームが立ち上がることになります。

これまで構成員として関わってきたプロジェクトを考えると、マネージャにも色々とDiffがありました。

顧客からの要望は全てYesで引き受け、仕様変更として扱わず、納期変更もなしに全て割り込みとして扱うマネージャ。ここだけ聞くとただの真っ黒なマネージャですが、誰よりも早く現場に入り、誰よりも遅く現場に残って人一倍仕事をしていたことを忘れてはなりません。

一方で、仕様変更は仕様変更として顧客と折り合いをつけ「こんなにうまくプロジェクトを動かすことができるのか」と度肝を抜かれるマネージャもいました。

もちろん顧客がどいういったタイプかでも変わってきますが、臨機応変な対応が必要であることには変わりありません。マネジメントされる側からマネジメントする側への転換にあたり、まだまだ学ぶべきことはあります。

 

■結局のところ

なんだかんだ書きましたが、結局のところ人との繋がりが大切なのだとしみじみと思います。

上司に外部勉強会を勧められなければ参加していなかったかもしれません。

先輩に誘われなければ社内勉強会を開催する経験をすることなく年を重ねていたでしょう。

とある筋から情報が流れてこなければ、新たな契約を取りにいく動きは発生していません。

もちろん、この「三種のDiff器」の起点に関わるDevLOVE現場甲子園2013の運営スタッフの方々がいなければ、ここに書いた物語は存在し得ませんでした。

上記全ての方に深い感謝をして、この記事のまとめとさせていただきたく。

 

■さて、次回は

第二のDiffで私を社内勉強会に誘った【先輩】がバトンを受け継いでくださるとのこと。恐悦至極。

どんなお話が聞けるのでしょうか。

今から楽しみで仕方がありません。

C#の列挙型(enum)でstring型を扱いたい場合は拡張メソッドを利用しよう

ほぼ半年振りとなりました。

ここだけの話もう2015年になっているらしいので更新してみます。

JavaっぽいエンジニアがC#を扱ったが為にアレコレ苦労しているというお話です。

 

C#の列挙型(enum)では、許容される型が以下に制限されています。
 ・byte
 ・sbyte
 ・short
 ・ushort
 ・int
 ・uint
 ・long
 ・ulong

数値型ばっかりです('A`)

そのため、Javaenumを扱うようにstringなどを使用することができません。

C#enumでstringなどの許容されていない型を使用する方法を調べたところ、

拡張メソッドを利用すると良さそうだったのでメモします。

 

例として、進捗を表すステータス「未着手」「作業中」「承認待ち」「承認済み」を

enum定義してstring型でステータス文字列が欲しい場面を考えます。

 

サンプルコード

1. namespace Xxx.Yyy.Zzz
2. {
3.     public enum XxxStatus
4.     {
5.         NotYetStarted, // 未着手
6.         Working, // 作業中
7.         ApprovalPending, // 承認待ち
8.         Approved // 承認済み
9.     }
10.
11.     // 拡張クラス
12.     public static class XxxStatusExt
13.     {
14.         // 拡張メソッド
15.         public static string ObtainStatus(this XxxStatus value)
16.         {
17.             string[] values = {"未着手", "作業中", "承認待ち", "承認済み"};
18.             return values[(int)value];
19.         }
20.     }
21. }

 

3〜9行目でenumを定義しています。

12〜20行目でenumの拡張クラスを定義しています。

拡張クラスは静的クラス(static)として定義する必要があります。

15〜19行目でXxxStatusクラス(今回はenum)の拡張メソッドを定義しています。

拡張メソッドは静的メソッド(static)として定義する必要があります。

15行目で一見すると拡張メソッドの引数を定義している箇所がありますが、これは引数ではありません。

最初のパラメータは、メソッドが操作する型をあらわします。

ここには、型の前にthis修飾子を付加する必要があります。

メソッドの引数は、最初のパラメータ以降に記載します。

つまり上記例では、

public static string ObtainStatus(this XxxStatus value)

となっていることから、

 ・XxxStatusの拡張メソッドである

 ・メソッドの引数は無し

という意味になります。

public static string ObtainStatus(this XxxStatus value, int num)

とすると、

 ・XxxStatusの拡張メソッドである

 ・メソッドの引数はint型のnum

という意味になります。

※引数にはthis修飾子はつけません。

 

拡張メソッドの話は一旦置いておいて、次にenumのお話です。

C#enumでは明示的にキャストすることで、何番目に定義されたかをint型で取得することが可能です。

上記例ではenum定義が

 ・NotYetStarted

 ・Working

 ・ApprovalPending

 ・Approved

の4つなので、int型にキャストすると考えると

 [0] NotYetStarted

 [1] Working

 [2] ApprovalPending

 [3] Approved

となります。この辺の考え方は配列と同様になります。

 

以上のことからサンプルソースの動作は、以下のようになります。

XxxStatus.NotYetStarted.ObtainStatus();
-> "未着手"

XxxStatus.Working.ObtainStatus();
-> "作業中"

XxxStatus.ApprovalPending.ObtainStatus();
-> "承認待ち"

XxxStatus.Approved.ObtainStatus();
-> "承認済み"

 

無事enumでstring型を扱う事が出来ました。

 

既存クラスに変更を加えずに機能拡張が可能という「拡張メソッド」は便利です。

知らない人から見ると理解できないコードになるのが難点ですが、

少し調べれば納得出来ると思うので、使える場面では使って行こうと思います。

 

GREATEST関数の引数限界を調べてみた@Oracle10g

GREATEST関数の引数限界に関して、255個が限界と書いているサイトがあった。

そのサイトにはOracleのバージョンに関する記載は無く、

気になったのでちょっと調べてみた。

 

試験環境はOracle10g。

 

とりあえず255個試してみた。

select GREATEST(

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,

21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,

41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,

61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,

81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,

101,102,103,104,105,106,107,108,109,110,

111,112,113,114,115,116,117,118,119,120,

121,122,123,124,125,126,127,128,129,130,

131,132,133,134,135,136,137,138,139,140,

141,142,143,144,145,146,147,148,149,150,

151,152,153,154,155,156,157,158,159,160,

161,162,163,164,165,166,167,168,169,170,

171,172,173,174,175,176,177,178,179,180,

181,182,183,184,185,186,187,188,189,190,

191,192,193,194,195,196,197,198,199,200,

201,202,203,204,205,206,207,208,209,210,

211,212,213,214,215,216,217,218,219,220,

221,222,223,224,225,226,227,228,229,230,

231,232,233,234,235,236,237,238,239,240,

241,242,243,244,245,246,247,248,249,250,

251,252,253,254,255)

as greatest_no from dual;

 

実行結果

--> 255

 

続けて256個を試してみたところ、正常に動作し256という値が得られた。

限界まで調査してみたところ、

59735 -> 正常に取得
59736 -> ORA-00939: 関数の引数が多すぎます。

となった。

 

59736って中途半端な...

2の○乗になってないのだけれど、なんでこの値なんだろう。

 

ちなみに、LEAST関数も同様の限界値であることは確認した。

他の関数がどうかは見てないけれど、恐らく似たようなものだと思う。

 

なんにせよ6万近い引数を与えるケースはそうそう無いだろうから、

限界はあまり気にしなくても良いみたい。