読者です 読者をやめる 読者になる 読者になる

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

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

デブサミ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型を扱いたい場合は拡張メソッドを利用しよう

C#

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

ここだけの話もう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

oracle

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万近い引数を与えるケースはそうそう無いだろうから、

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

 

憧れのQNAPを購入した

NAS

松竹梅に加えて特松の4構成の中から、

 ・初めての市販NAS

 ・用途を考えるととりあえず低スペックでOK

 ・いざとなったらHDD入替だけで上位NASへ移管可能

ということで最安のTS-220を購入しました。

 

購入内容一式

・QNAP TurboNAS TS-220

Western Digital Red 3TB * 2 (WD30EFRX [3TB SATA600])

・ミヨシ MCO カテゴリー6準拠フラットLAN ケーブル 15m (TWF-615W)

・ミヨシ LANヨウケーブルクリップ (CAT-FLP)

f:id:monokurotamago:20140622103902j:plain

タバコの箱は比較用です。

比較用に用いていますが、タバコは吸いません。

 

HDDは最後まで悩みました。

WD REDにするのは決定事項だったのですが、容量を2TB, 3TB, 4TBのどれにするか…

結局、購入時点で一番コストパフォーマンスが良かった3TBに決めました。

 

 

箱の中身

・本体

電源ケーブル

・HDD止めのネジ(2.5インチ用と3.5インチ用)

・LANケーブル

・説明書

f:id:monokurotamago:20140622104325j:plain

 

 

説明書は色んなブログで書かれていた通り、実に簡素な内容でした。

HDDを取り付けて、ネジで固定します。

f:id:monokurotamago:20140622104854j:plain

HDD装着後は、電源ケーブルを取り付けてNAS側の準備完了。

簡単!

 

続けてLAN線を配置します。

これが一番大変でした。

ルータのある部屋から洗濯機のところまでLAN線を引いていきます。

LAN線は要所要所でクリップ固定して、邪魔にならないようにします。

配線がようやく終わり、NASと接続すれば完了。

 

 

こうなります。

f:id:monokurotamago:20140622114321j:plain

洗濯機の上部に突っ張り棒でスペースを作ってNASを配置。

ここに置いた理由は、

 ・ルータのある部屋は寝室なのでNASを配置したくなかった

 ・そもそもルータのある部屋はコンセントが不足していた

 ・洗濯機のところはコンセントが余っていた

 ・突っ張り棒でスペースが確保出来た

から。

湿気が気になりますが、コンセントはどうしようもありません。

 

 

NASの管理インタフェースはWebブラウザからアクセスでき、

見ればどう使えば良いか大体分かる洗練されたインタフェースなので安心です。

分からないことがあったらWebマニュアルがあるのでそちらを調べます。

 

NASの初期設定をアレコレ(中略)して、

ミラーリングされていることを確認できたのでNASの設置は完了です。

 

いよいよアクセス…

というところで問題発生して、一つ前の記事にしたネットワーク関連でハマりました。

 

が、それも無事解決でき、GitBucketの導入(後日記事にするかも)まで終わりました。

あとは使いながらQNAPの機能を楽しみます。

 

 

……

………

 

 

先日購入した裸族のカプセルホテルですが、

とりあえずまだWindowsマシンに接続しています。

対応OSがWindowsMacだったのですが、

大抵の市販品はLinux対応とは書かれていません。

それでもLinux対応と書かれていないUSBメモリは大抵マウント可能なので、

NASに裸族のカプセルホテルをつなげてみようかと思っています。

うまく出来ればバックアップに使えそうです。

 

以上。

Wi-Fiルータがデバイス間のアクセスを防御していた

Network

ネットワーク周りでハマったのでメモ。

 

■2014/06/29時点のネットワーク構成

有線ルータの下にマシン3台と無線ルータ、

無線ルータの下にマシン2台が紐づいている形。

どこにもつながっていないマシン2台はお休み中。

 

f:id:monokurotamago:20140629144453p:plain

 

 

■何が起きたか

MacからWindowsへのpingが通らない(WindowsからMacへのpingは通る)。

MacからNASへのpingが通らない(WindowsからNASへのpingは通る)。

Macからインターネットへのアクセスは出来ている。

 

 

■原因追究

WindowsのICMP受信設定 -> 今回は関係なかった。

WindowsMac双方のファイアウォール設定 -> 今回は関係なかった。

有線ルータの設定 -> 今回は関係なかった。

Wi-Fiルータの設定 -> こいつが犯人。

 

 

■対応

とりあえずWi-Fiルータipアドレスを調べため、有線ルータの管理画面にログイン。

紐づいているIPからWindowsマシンなどを除外して、Wi-FiルータのIPを推測。

ブラウザにIPアドレスを入力してWi-Fiルータにログイン。

 

ちなみに使用Wi-Fiルータは[au HOME SPOT CUBE]。

外側へのアクセスは許可していたが、内側へのアクセスを止めていた(隔離設定)。

 ①上部メニュー(Wi-Fi設定)をクリック

 ②左部メニュー(隔離設定)をクリック

 ③該当のSSIDの隔離設定を無効化

これで解決。

 

f:id:monokurotamago:20140629143217p:plain

 

 

以上。