paiza開発日誌

IT/Webエンジニア向け総合求人・学習サービス「paiza」(https://paiza.jp ギノ株式会社)の開発者が開発の事、プログラミングネタ、ITエンジニアの転職などについて書いています。

エンジニアを目指す就活生のIT業界研究、自社開発・受託開発の違いとは

f:id:paiza:20170313201732j:plain
Photo by blupics
f:id:paiza:20140916135428p:plainこんにちは、谷口です。

ITエンジニアを目指す就活生の皆さん、応募する企業はどうやって選んでいますか

「プログラミングができればどこでもいい」「どこに入社しても同じでしょ」と考えて応募先を適当に選んでいる人もいるかもしれませんが、これはちょっと危険です

例えば「文系出身・プログラミング未経験者でもOK!」という企業と「情報系出身で開発経験が既にあることが必須条件」という企業では、キャリアパスや求められる仕事は大きく異なります。

これを知らずに適当に企業を選んでしまうと、入社後に「思ってたのと違った……」とミスマッチが生じてしまいます。実際、それが原因で入社間もなくから転職活動を始める人も多いです。

今回はIT業界の構造や、業種ごとに求められるスキルや仕事内容の違いを紹介します。どんな企業を選ぶか、どんな仕事をしたいのかを考える参考にしていただければと思います。

■エンジニアを募集している企業とその特徴

新卒求人が多い企業の主流として、ざっくり自社開発・受託開発の元請け・受託開発の下請けにおける開発部門のエンジニアという分類で説明していきます。

※このほかにも組み込みエンジニアや社内エンジニア、よりニッチな領域を研究開発をしているエンジニアなども含めると分類は多岐に渡ります。また、大手企業では、開発部門以外にもインフラエンジニア、ネットワークエンジニア、セールスエンジニアなど職務が細かく分かれる場合もあります。より深く専門性を求められる求人は中途転職経験者の募集が多い傾向にあるため、新卒求人が多い業種に絞って紹介していきます。

■自社開発

f:id:paiza:20170314122258j:plain
Photo by Sorosh Tavakoli
自社内で、自社製品であるサービスやアプリ、ゲームやパッケージソフトなどなどを作っている企業です。

◆何を作るの?

B2B・B2C問わず多種多様なプロダクトがありますが、
例えば

などなどがあります。

詳しくはpaiza新卒の求人票でごらんください。
IT/WEBエンジニアの求人情報 | ITエンジニアを目指す学生の就活サイトpaiza新卒

◆大手の自社開発企業

大手企業やメガベンチャーでは育成枠を設けているところもありますが、多くの企業ではエンジニアとしての即戦力が求められています。たとえばYahoo!楽天クックパッドサイバーエージェントコロプラなどなど……の企業がこれに当たります。

◇利点

  • 比較的自由な社風(私服通勤、裁量労働制など)の企業が多い
  • ユーザー数が多い有名プロダクトの開発に携われる
  • 分野にもよるが、比較的新しい技術を採用している企業が多い
  • 研修や福利厚生、昇給制度などがしっかりしている

◇欠点

  • 開発部門の人数が多いと、仕事が細かく分業されて、裁量が少ない場合もある

◇求められる資質

  • 開発スキル(育成枠でも採用時にプログラミングの素質や地頭のよさが重視されます)
  • 技術を追う感度
  • ユーザーなどの調査、分析、企画スキル

※分業が進んでいる企業の場合は企画や数値分析の部門が分かれている場合もあります

◆小規模スタートアップの自社開発企業

自社サービスを開発している企業というと前述のような有名企業が思い浮かぶと思いますが、まだ数人~数十人規模の小規模スタートアップ企業もかなりたくさんあります。

かつてはスキルと経験のある中途転職者の募集が中心でしたが、最近は「開発経験がある人なら新卒も採用したい」という企業もかなり増えてきました。

◇利点

  • 大手と同様に、比較的自由な社風で新しい技術を採用している企業が多い
  • 幅広く裁量の大きい仕事に携われる

大手に比べると人数が少ない分、幅広くいろいろな業務に携わることができるのがスタートアップ企業の魅力かと思います。

◇欠点

  • 安定性に欠ける
  • 立ち上げたばかりの企業では、研修や会社の制度が整っていない場合もある

大企業なら必ずしも安定……という世の中ではなくなってきましたが、小規模なスタートアップの段階では、やはり安定性に劣ります。これまでになかった新しいサービスを企画・制作・運営し、軌道に乗せる仕事は、夢があるように思えますがかなり大変です。うまくいって成功すればよいのですが、頑張って作ったものがお金にならず、軌道に乗せられないままクローズになって、会社自体も終了してしまった……といったパターンは珍しくありません。


また、これは欠点とも利点ともなるポイントですが、小規模なスタートアップの場合、会社で明確なキャリアパスが用意されているわけではないため、自分でどんな方向に進むのか(例えば開発チームをまとめるリーダーポジションになっていくとか、そうではなく専門性を深めていくとか……)を考えていく必要があります

しっかりしたスキルとキャリアビジョンがある人なら、転職や起業なども叶いやすい業界です。ただ、与えられた仕事をしていれば出世コースに乗れる環境ではないため、自分でキャリアを考えて目標達成していかねばならない点はかなり大変かと思います。

◆求められる資質

  • 開発スキル
  • 技術を追う感度
  • スピード感
  • ユーザーなどの調査、分析、企画スキル

スタートアップの場合、より即戦力レベルの開発スキルが求められます。また、決まった機能をすぐに開発してリリースして反応を見て改善して……といったことがよくあるため、そのスピード感についていけることが重要になります。

■受託開発

f:id:paiza:20170314122549j:plain
Photo by Adikos
さまざまな顧客から依頼を受けて、システム開発を行っているのが受託開発企業です。(システム インテグレーター、SIer、SIと呼ばれることも多いです)

例えば、銀行ではATMで作動するシステムが必要ですよね。そこで、銀行からの「こういうシステムを作ってください」と注文を受けて、その通りに作るのが受託開発企業の仕事です。

この例で言うと、銀行から直接注文を受けたのが元請け企業で、この元請けから注文を受けて、大きなATMシステムを分割したパーツごとにプログラミングしていくのが下請け企業となります。

◆何を作っている企業があるの?

B2Bやバックエンドのシステムが多い傾向にありますが、非IT企業から依頼を受けてB2Cサービスを作ることもあります。

  • 金融系システム(ATMなど)
  • 官公庁系システム(市役所で使われるシステムなど)
  • 医療系システム(病院で使われるシステムなど)
  • 民間の非IT企業のサービス(メーカーの通販サイトなど)

などなどがあります。

詳しくはpaiza新卒の求人票でごらんください。
IT/WEBエンジニアの求人情報 | ITエンジニアを目指す学生の就活サイトpaiza新卒

◆元請け企業

元請け企業のエンジニアは、主に前述のATMのシステムのような大規模開発で、プロジェクトマネージャーとして開発者たちをまとめなければなりません。社員は入社後大体1~2年ほどで、プログラミングをするよりもマネージャー側の管理業務を任されるようになります。

受託開発は、顧客とすり合わせて「この日までにいくらでこういうシステムを作ってください」と契約を交わした上で開発業務に取り掛かるため、システムを作ることができればお金は入ってきます。また、元請け企業は大企業が多く、経営も安定しているところが多いです。

◇利点

  • 上位請けは大企業で経営が安定していることが多い
  • いろいろな開発プロジェクトを経験できる
  • 明確なキャリアパスがある

元請けに近い上位企業になるほど、大手企業で経営が安定していたり、研修制度や昇給制度、福利厚生などが充実していたりします。また、元請け企業のエンジニアには、マネジメントに移っていくキャリアパスが用意されているため、それに従っていけば安定してキャリアを積んでいくことができます

◇欠点

  • 数年でプログラミングをする必要がなくなる
  • 仕事で新しい技術を使えないことが多い

前述の通り、キャリアを積んでいくと、そのぶん開発よりもマネジメント業務が中心となっていくため、仕事を通して開発スキルを磨くのが難しくなっていきます。

また使用できる開発環境は限定されることも多く、「仕事で最新技術をがんがん使いたい」という人には向かないかもしれません。

◇元請けで求められる資質

  • 客先とうまくやり取りや交渉ができる
  • スケジュールや人員を管理できる
  • 設計のスキル
  • 技術選定ができる

受託開発の場合、期日や予算の範囲を守って、システムを必ず完成させなければなりません。そのためにはプロジェクトの人員やスケジュールを管理するスキルが必要です。元請け企業の場合は、小規模な自社開発企業よりも、仕事を通してこうした管理スキルを身につけやすい環境かと思います。

また、「受注したシステムをどんな技術を使って作るのか?」を決める技術選定をする場面もあるため、ミドルウェアやライブラリなどの特徴を調べて把握する力も必要です。

■下請け企業

上記の元請けから業務を受注して、開発を行うのが下請け企業です。構造がややこしいですが、大規模な開発案件は、システムを作りたい顧客から元請け企業が受注し、分割してさらに二次請け、三次請けへ発注する……といった行程で作られるものがほとんどです。この二次請け、三次請け……n次請け……と仕事の降りてくる企業が下請け企業となります。

◇利点

  • 未経験でも入社でき、研修でプログラミングを学べる
  • 開発要件は決まっており、実装に集中しやすい
  • 元請け企業よりも手を動かしていられる期間が長い

◇欠点

  • 元請けと同様に、開発環境が限られているため仕事で新しい技術を使えないことも多い
  • スケジュールのしわよせを受けて激務になることもある
  • 元請け企業や顧客企業で常駐して開発する仕事が多い

元請け企業や顧客企業の都合に合わせるケースが多いため、自社ではなく常駐先で開発すること多いです。またスケジュールの厳しいプロジェクトに入ると業務量のコントロールがしにくく激務になってしまうことがあります。

◇受託で求められる資質

  • タスクを管理できる
  • 納期までに作りきる
  • 設計書などのドキュメントを読み解くスキル

■まとめ

同じエンジニアでも、業務の進め方や求められるスキルはこのように異なっています。

どちらがよい・悪いということではなく、応募する前に業務内容や特徴を把握できていれば、入社してから「思ってたのと違った」「こんなはずじゃなかった」といったミスマッチを減らすことができるでしょう。

動画でプログラミングが学べるpaizaラーニングでは、「ITエンジニアの就活準備」講座を公開しています。IT業界の構造やエンジニアの働き方を学べるレッスンは無料で見られますのでぜひチェックしてみてください。
paiza.jp

また、paiza新卒ではエンジニアを目指す学生向けの求人情報を多数掲載しています。

ITエンジニアを目指す就活生の方、エンジニアのキャリアについて学びたい方はぜひごらんください。

paiza.jp

paiza.jp




paiza新卒」は、ITエンジニアを目指す人たちのための、IT/Webエンジニア求人に100%特化した就職サービスです。プログラミングスキルチェック(コーディングのテスト)を受けて、スコアが一定基準を超えれば、ES選考なしで複数の企業へ応募ができます。
paiza.jp
まずはスキルチェックだけ、という使い方もできます。自分のプログラミングスキルを客観的に知ることができますので、興味がある方はぜひ一度ご覧ください。
paiza.jp
また、paiza新卒をご利用いただいている企業や、paiza新卒を使って就職に成功した方へのインタビューもございます。こちらもぜひチェックしてみてください。

paiza新卒:企業インタビュー&就活成功者の声

ITプログラマ・エンジニア向け転職・就活・学習サービスのpaiza

JavaScript開発はこれ1つでOK!超お手軽にWebアプリを作れる全部入りコードエディタ「Gomix」の使い方大公開!

f:id:paiza:20170312211945j:plain
どうも、まさとらん(@0310lan)です。

今回は、JavaScriptでWeb開発をされている方や、これから勉強しようという方も含めてとても便利に使える無料オンラインエディタのご紹介です!

バックエンドは「Node.js」でプログラミングして、フロントエンドは「HTML / CSS / JavaScript」で開発し、そのままホスティングもしてくれるので手軽に公開することも可能なスグレモノですよ。

Gomix

f:id:paiza:20170312212054j:plain
以前は「HyperDev」という名称でサービスが公開されていましたが、現在は「Gomix」というサービス名に変更されており、今も活発にバージョンアップが続けられています。

■基本的な使い方!

それでは、実際に「Gomix」を使いながらどのようなサービスなのかを見ていきましょう!

まずは、ブラウザから「https://gomix.com」にアクセスすると、いきなりコードエディタが起動して表示されます。
f:id:paiza:20170312212130j:plain
(初回のみ「コミュニティページ」に飛びます…)


Gomix」は、「登録」などをせずにそのままでも利用可能です。

ただし、無料のユーザー登録をしておけば「プロジェクトの保存」や「書き出し」などができて便利なので、サクッと済ませておきましょう!


登録は簡単で、「Facebook」か「Github」を連携するだけで完了します。
f:id:paiza:20170312212209j:plain
オススメは「Github」との連携です。

後述しますが、「Gomix」で作ったプロジェクトをそのままGithubリポジトリに書き出すことも可能です。(インポートも可)


また、ユーザー登録をすることでエディタの「テーマカラー(黒色)」も変更できます。
f:id:paiza:20170312212218j:plain


画面左上の「プロジェクト名」をクリックすると表示されるオプションから、さまざまな設定もできます!
f:id:paiza:20170312212228j:plain
「プロジェクト名」は好きな名称に変更でき、概要も合わせて記述できます。(プロジェクト名は、公開用のURLとしても利用されます)

また、複数のプロジェクトを保存して一覧を確認したり、新規プロジェクトを作成することも出来ます。


下段にある「Advanced Options」をクリックすると、さらに詳細なオプションが表示されます!
f:id:paiza:20170312212249j:plain
プロジェクトは初期状態だと「公開状態」になっているので、これを「①非公開」にしたり、自分のGitHubアカウントを使ってプロジェクトを「②インポート/エクスポート」することも可能です。

もちろんプロジェクト自体をパソコンに「③ダウンロード」することもできます。


ちなみに、GitHubへエクスポートする場合は…
【ユーザー名】/【リポジトリ名】
をフォームに入力して送信するようにします。


例えば、ユーザー名が「webhacck」で、リポジトリ名が「mysample」だとしたら、「webhacck/mysample」となります!
f:id:paiza:20170312212327j:plain
また、新規リポジトリの場合、1回以上のコミットが無いとうまく実行できないので、最初に「README.md」などを作ってから行うと良いでしょう。


さらに、「①share」ボタンをクリックして表示される「②URL」をシェアするだけで、複数人とコラボしながらプログラミングすることも可能!
f:id:paiza:20170312212334j:plain
ペアプログラミングなどにも有効活用できそうですね。


プロジェクトは、「Show」ボタンをクリックすることで、いつでも画面の状態を確認することが出来ます。
f:id:paiza:20170312212342j:plain
初期状態で「リアルタイムコーディング」が有効になっているので、コードをいじると画面の状態も随時反映されるようになっているので便利です。

■「Gomix」のプログラミングについて!

基本的な使い方を学んだところで、今度はプログラミングの方法について見ていきましょう!

簡単なサンプルデモとして、サーバーから画像リストを取得して表示するWebページを作りたいと思います。
f:id:paiza:20170312212359j:plain


まず最初に、「Gomix」は類似のエディタと違って、ファイル構造が「①バックエンド」と「②フロントエンド」の2種類に分かれていることを把握しておきましょう。
f:id:paiza:20170312212421j:plain
「バックエンド」のプログラミングとして、すでにNode.jsやexpressなどがインストールされているのが分かります。


また、「package.json」のファイルを選択して表示される「Add package」から、自分で好きなNode.js用パッケージを検索して追加することも簡単に出来ます!
f:id:paiza:20170312212448j:plain
もしパッケージの新バージョンがリリースされていれば、それも合わせて通知してくれるので便利です。

あとは、フレームワークの「express」を使って、どんどんサーバーサイドのプログラミングを書いていきましょう。


基本となる最小限のコードはこんな感じになるでしょう!

var express = require('express');
var app = express();




// publicフォルダを静的コンテンツとして利用
app.use(express.static('public'));




// トップページを「views」フォルダ内のindex.htmlに設定
app.get("/", function (request, response) {
    response.sendFile(__dirname + '/views/index.html');
});




// 「process.env.PORT」で[https://gomix.com:title=Gomix]のポート番号を取得して待ち受け
var listener = app.listen(process.env.PORT, function () {
    console.log('ポート番号 ' + listener.address().port + '番で待ち受け中…');
});

Gomix」のデフォルト状態だと、フロントエンドの静的コンテンツは「public」フォルダに収められているので、最初に「express.static(‘public’)」と指定しておきます。

「index.html」は「views」フォルダに収められているので、これをトップページとして表示する設定も行っておきましょう。


また、「Gomix」のポート番号はあらかじめ「process.env.PORT」という環境変数で取得できるようになっているのですが、他にも認証に必要な「APIキー」や「IDコード」などを外部に公開しないための「SECRET変数」も用意されています。
f:id:paiza:20170312212531j:plain
「.env」ファイルに好きな変数名で記述可能で、この内容は自分しか見れないようになっているわけですが、プログラムからアクセスするには「process.env.SECRET」のように書けばOKです!

これにより、さまざまなWeb APIと連携したサービスを開発したり、Firebaseのようなバックエンドサービスと連携してWebアプリを作っていくのも面白いでしょう。


さて、サーバー側に「画像データ」を保持する必要があるのですが、今回は簡単な配列を作って準備します。

// 画像のリストを返す
app.get("/imglist", function (request, response) {
  response.send(imgList);
});


// 画像URLリスト
var imgList = [
  'sample1.jpg',
  'sample2.jpg',
  'sample3.jpg',
        ・
        ・
        ・
]


画像ファイルなどは、「assets」フォルダにドラッグ&ドロップで保存することが可能です。
f:id:paiza:20170312212613j:plain
他にも、動画や音楽などWebページに必要なリソースはコチラに保存しておくと良いでしょう。


ここまで来たら、あとはフロントエンドのJavaScriptからサーバーの「画像リスト」を取得してWebに表示するだけです!

  // 「/imglist」にアクセスして画像リストを取得
  $.get('/imglist', function(imglist) {
    
    // 画像リストを参照して、すべての画像を表示する
    imglist.forEach(function(img) {


        $('<div class="column is-one-quarter"><img src="'+ img +'"></div>')
        .appendTo('#imgbox');


    });
    
  });


サンプルデモはコチラから確認できます!
【サンプルデモのリンク】

また、ソースコードは公開用の「Gomixエディタ」から閲覧可能です!
【サンプルデモのGomixエディタ】


今回のサンプルデモは、画像を表示するだけなのでフロントエンドだけでも同じモノが作れますが、「Gomix」の練習用としては最適かと思います。

また、今回作ったようなexpressでのミニコードを使って、バックエンドはそのままにしておいて「フロントエンド」だけをプログラミングするためのエディタとして活用しても良いでしょう。

■「Gomixコミュニティ」とは?

最後に、「コミュニティページ」について解説しておきたいと思います。


Gomix」はオンラインエディタなので、ブラウザからアクセスすればエディタが起動し、すぐにでもプログラミングを始められます。

しかし、類似サービスと違って「コミュニティ」がしっかりと作られているのが特徴で、ユーザーにとって有益な情報が簡単に得られるようになっているため、「Gomix」ってどんなサービスだろう?という時に初めて見るページとしては最適です!

【 Gomixコミュニティページ】
f:id:paiza:20170312212730j:plain
「コミュニティページ」では、プログラミングの学習で利用できる豊富なチュートリアルや、「Gomix」を使った開発事例としてさまざまな「サンプルデモ」が公開されています。


Webアプリの開発事例だけでなく、「フレームワークの基本」を学んだり「ゲーム」や「IoT」などの事例もたくさん用意されています。
f:id:paiza:20170312212740j:plain


気になった事例のプロジェクトをクリックすると、プレビューも確認できます!
f:id:paiza:20170312212751j:plain
「Show」ボタンをクリックすると、実際にWebアプリをブラウザで体験できるようになっているほか、「Gomix」を起動して実際のソースコードを閲覧することも可能です。

さらに、「Remix」ボタンをクリックすることで、自分のプロジェクトとしてカスタマイズすることもできるので便利です。


このような「コミュニティページ」があるおかげで、「Gomix」を初めて利用する人もすぐにプログラミングを楽しめるようになっており、学習教材も豊富にあるのでこれから勉強しようという人にも大きな魅力となっています。


また、「Gomix」をざっくりと解説した公式動画もあるので、ご興味ある方はぜひチェックしてみてください!

■まとめ

今回ご紹介した「Gomix」さえあれば、ReactやAngular2をはじめとするフレームワークを活用したWebアプリから、ゲーム、IoT、チャットボット…など、非常に多彩なプロジェクトを今すぐ開発することが可能になります。

また、使っていて分からない点があれば公式の「サポートフォーラム」を使って、活発な意見交換も行われているので安心です。

とにかく、無料でココまでいじれるエディタは珍しいので、ぜひみなさんも積極的にチャレンジしてみてください!

JavaScript・HTML/CSS講座も好評公開中「paizaラーニング


paizaラーニング」では、未経験者でもブラウザさえあれば、今すぐプログラミングの基礎が動画で学べるレッスンを多数用意しております。

もちろん今回の記事で使用したJavaScriptやHTMLなど、言語ごとに基礎を学べる入門講座も好評公開中です!

↓詳しくはこちら
paiza.jp

そして、paizaでは、Webサービス開発企業などで求められるコーディング力や、テストケースを想定する力などが問われるプログラミングスキルチェック問題も提供しています。
paiza.jp
スキルチェックに挑戦した人は、その結果によってS・A・B・C・D・Eの6段階のランクを取得できます。必要なスキルランクを取得すれば、書類選考なしで企業の求人に応募することも可能です。「自分のプログラミングスキルを客観的に知りたい」「スキルを使って転職したい」という方は、ぜひチャレンジしてみてください。

ITプログラマ・エンジニア向け転職・就活・学習サービスのpaiza

コマンドラインツールを自動生成できるPython Fireと他のライブラリ比べてみた

f:id:paiza:20170310142402j:plain
Photo by Jayphen
秋山です。

先日「Python Fire」という、Pythonコマンドラインツールを自動生成できるライブラリが発表されました。

どのへんが便利なのか、実際に使ってみながら解説をしていきますので、気になってた人の参考になればと思います。

Googleリポジトリに出ているのでGoogleの公式プロダクト?と思いきや、最後に「This is not an official Google product.」の表記があるのでGoogle公式ではないようですね。Googleの中の人が作った非公式ライブラリということでしょうかね。

github.com

Python Fire使ってみた

そもそもPythonには、コマンドラインからコマンドを受け付ける組み込みのライブラリがあります。他にもbakerとか、clickとか、既にコマンドラインツールを作る用の補助ライブラリもいくつかあります。

今回は「コマンドを叩けば流行りのbitcoinの価格をチェックできるようなツールを作る」ことを目的に、Python Fireと各ライブラリを試しながら比較してみたいと思います。(ちなみに私は普段はよくbakerか組み込みライブラリを使っています)

bitFlyerさんが公開されている、簡単に使えるtickerを取得するpublic apiを利用させていただきます。(詳しくはこちら

ちなみにbitFlyerさんの求人情報はこちら。
株式会社bitFlyer エンジニア求人 | ITプログラマ・エンジニア向け転職・就活・学習サービスのpaiza


ではまず単純に、価格を取得するpythonのコードを書いてみます。

def bitflyer_getticker(product_code, is_json):                                                      
    end_point = "https://api.bitflyer.jp/v1/getticker"                                              
    r = requests.get(end_point, params={'product_code' : product_code})                             
    r_json = json.loads(r.text)                                                                     
    if product_code == None:                                                                        
        print('BTC_JPY')                                                                            
    else:                                                                                           
        print(product_code)                                                                         
                                                                                                    
    if is_json:                                                                                     
        print(r_json)                                                                               
    else:                                                                                           
        print("bid:{}".format(r_json['best_bid']))                                                  
        print("ask{}".format(r_json['best_ask'])) 

product_codeは、BTC_JPY(bitcoinと円) やBTC_ETC(bitcoinとetherium)を指定することができます。(詳細はbitFlyerさんのAPIのドキュメントを参照してください)

is_jsonがtrueなら、jsonをprintするようにしています。これ以降はこのメソッドを流用して、各ライブラリでコマンドラインツール化をしてみましょう。

コードの再利用性や他のAPIへの対応はひとまず考えずに、tickerの取得のみをします。


まずはPython標準の argparse を使ってみましょう。

def bitflyer_getticker(product_code, is_json):                                                      
    end_point = "https://api.bitflyer.jp/v1/getticker"                                              
    r = requests.get(end_point, params={'product_code' : product_code})                             
    r_json = json.loads(r.text)                                                                     
    if product_code == None:                                                                        
        print('BTC_JPY')                                                                            
    else:                                                                                           
        print(product_code)                                                                         
                                                                                                    
    if is_json:                                                                                     
        print(r_json)                                                                               
    else:                                                                                           
        print("bid:{}".format(r_json['best_bid']))                                                  
        print("ask{}".format(r_json['best_ask']))                                                   
                                                                                                    
import argparse                                                                                     
                                                                                                    
parser = argparse.ArgumentParser(description='bitflyer api getticker')                              
parser.add_argument('-p', '--p', type=str, help=u'BTC_JPY or BTC_ETH')                              
parser.add_argument('-j', '--json', action='store_true', help=u"return json")                        
                                                                                                    
args = parser.parse_args()                                                                          
bitflyer_getticker(product_code=args.p, is_json=args.json)                                          

上記のコードでは、-pオプションでBTC_JPYとかETH_BTCを文字列で指定できるようにして、--jsonオプションでjsonを返すようにしてみました。

python bitflyer.py -p ETH_BTC --json

とすると、ETH_BTCを指定して、jsonを出力となります。各コマンドを省略するとBTC_JPYのaskとbidのみ出力します。

とりあえず、使えるようにはなりましたね。


では次に、bakerを使ってみましょう。

bakerはimportして@baker.commandするだけで、なんとな~くコマンドラインツールっぽくしてくれます。

import requests, json, baker                                                                        
                                                                                                    
@baker.command(params={"product_code": "'BTC_JPY or BTC_ETH", "is_json": "return json"})                                                                                      
def bitflyer_getticker(product_code='BTC_JPY', is_json=False):                                      
    """bitflyer api getticker                                                                  
    """                                                                                             
    end_point = "https://api.bitflyer.jp/v1/getticker"                                              
    r = requests.get(end_point, params={'product_code' : product_code})                             
    r_json = json.loads(r.text)                                                                     
    if product_code == None:                                                                        
        print('BTC_JPY')                                                                            
    else:                                                                                           
        print(product_code)                                                                         
                                                                                                    
    if is_json:                                                                                     
        print(r_json)                                                                               
    else:                                                                                           
        print("bid:{}".format(r_json['best_bid']))                                                  
        print("ask{}".format(r_json['best_ask']))                                                   
                                                                                                    
baker.run() 

これで、メソッド名をサブコマンドとしてコマンドラインツールっぽく使えるようになります。

python bitflyer_baker.py bitflyer_getticker --product_code ETH_BTC --is_json

ETH_BTCを指定し、jsonを出力します。各コマンドを省略すると、BTC_JPYのaskとbidのみ出力します。

メソッド名がサブコマンドとされたり、–helpとするとコメントの部分が出力されたり、paramsで設定したオプションの詳細などが以下のように表示されます。

python bitflyer_baker.py bitflyer_getticker --help
Usage: bitflyer_baker.py bitflyer_getticker [<product_code>] [<is_json>]

bitflyer api getticker

Options:

   --product_code  'BTC_JPY or BTC_ETH
   --is_json       return json

ざっくりコマンドツールを作る場合はこれで十分かもしれません。


続いてclickでやってみます。

import requests, json, click                                                                        
                                                                                                    
@click.command()                                                                                    
@click.option('--product_code', '-p', default='BTC_JPY', help=u'BTC_JPY or BTC_ETH')                
@click.option('--is_json/--no-is_json', default=False, help=u"return json")                         
def bitflyer_getticker(product_code='BTC_JPY', is_json=False):                                      
    end_point = "https://api.bitflyer.jp/v1/getticker"                                              
    r = requests.get(end_point, params={'product_code' : product_code})                             
    r_json = json.loads(r.text)                                                                     
    if product_code == None:                                                                        
        print('BTC_JPY')                                                                            
    else:                                                                                           
        print(product_code)                                                                         
                                                                                                    
    if is_json:                                                                                     
        print(r_json)                                                                               
    else:                                                                                           
        print("bid:{}".format(r_json['best_bid']))                                                  
        print("ask{}".format(r_json['best_ask']))                                                   
                                                                                                    
if __name__ == "__main__":                                                                          
    bitflyer_getticker()
python  bitflyer_click.py -p ETH_BTC --is_json

とすると、ETH_BTCを指定しjsonを出力となります。各コマンドを省略するとBTC_JPYのaskとbidのみ出力します。

こちらも–helpオプションで表示されるメッセージが、オプションなどからいい感じに作ってもらえます。こんな感じで表示されます。

python  bitflyer_click.py --help
Usage: bitflyer_click.py [OPTIONS]

Options:
  -p, --product_code TEXT   BTC_JPY or BTC_ETH
  --is_json / --no-is_json  return json
  --help                    Show this message and exit.


では最後に、Python Fireで作ってみます。

import requests, json, fire                                                                         
                                                                                                    
def bitflyer_getticker(product_code='BTC_JPY', is_json=False):                                      
    end_point = "https://api.bitflyer.jp/v1/getticker"                                              
    r = requests.get(end_point, params={'product_code' : product_code})                             
    r_json = json.loads(r.text)                                                                     
    if product_code == None:                                                                        
        print('BTC_JPY')                                                                            
    else:                                                                                           
        print(product_code)                                                                         
                                                                                                    
    if is_json:                                                                                     
        print(r_json)                                                                               
    else:                                                                                           
        print("bid:{}".format(r_json['best_bid']))                                                  
        print("ask{}".format(r_json['best_ask']))                                                   
                                                                                                    
if __name__ == "__main__":                                                                          
    fire.Fire(bitflyer_getticker)

ちなみにクラスをつっこむなら以下のようにします。

import requests, json, fire                                                                                                                                                              
class Bitflyer():                                                                                   
    def __init__(self, end_point="https://api.bitflyer.jp/v1/getticker"):                           
        self.end_point = end_point                                                                  
                                                                                                    
    def getticker(self, product_code='BTC_JPY', is_json=False):                                     
        r = requests.get(self.end_point, params={'product_code' : product_code})                    
        r_json = json.loads(r.text)                                                                 
        if product_code == None:                                                                    
            print('BTC_JPY')                                                                        
        else:                                                                                       
            print(product_code)                                                                     
                                                                                                    
        if is_json:                                                                                 
            print(r_json)                                                                           
        else:                                                                                       
            print("bid:{}".format(r_json['best_bid']))                                              
            print("ask{}".format(r_json['best_ask']))                                               
                                                                                                    
if __name__ == "__main__":                                                                          
    fire.Fire(Bitflyer)

fire.Fire()にクラスを投げ込むだけでコマンドラインツール化してくれます。

コマンド上では、クラスを突っ込んだ場合はメソッド名をサブコマンドとして、このように引数を順に与えている感じになります。

python bitflyer_fire.py getticker ETH_BTC True

引数の順番を変えたい場合などは -- をつけて

python bitflyer_fire.py getticker --product_code=ETH_BTC --is_json=True

というようなコマンドで実行できます。

ヘルプは以下のようになります。

python bitflyer_fire.py -- --help
Type:        type
String form: <class '__main__.Bitflyer'>
File:        ~/python_commands/bitflyer_fire.py
Line:        4

Usage:       bitflyer_fire.py [END_POINT]
             bitflyer_fire.py [--end-point END_POINT]


さらにPython Fire用の特殊なオプションがいくつかあります。

それらオプションは上記で説明したコマンドの末尾に -- で区切り --verbose などとつけることが出来ます。

上記のクラスをfireに渡した場合を例に試してみます。

--interactive

こちらはインタラクティブモードで実行、IPython上で実行されます。

python bitflyer_fire.py -- --interactive

とすると、以下のようにREPLが起動します。

Fire is starting a Python REPL with the following objects:
Modules: fire, json, requests
Objects: Bitflyer, bitflyer_fire.py, component, result, trace

Python 3.6.0 (default, Jan  5 2017, 13:12:02)
Type "copyright", "credits" or "license" for more information.

IPython 5.1.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: Bitflyer().getticker()
BTC_JPY
bid:138251.0
ask138407.0

In [2]: 

REPL上でBitflyer().getticker()とするとコマンド実行と同じように動作します。

--completion

こちらのコマンドはbash用のコマンドの補完が出来るようになるスクリプトを吐きます。

.bashrcなどに貼り付け、パスが通っており、実行権限を与えると動作するようになります。


他にも以下のようなオプションがいくつかありますが、特に有用なのは上2つかと思います。

--help
--trace
--separator
--verbose

ちなみにこれらオプションの詳細は、以下のページに記載されています。
python-fire/using-cli.md at master · google/python-fire · GitHub

■まとめ

今の目的だと、Pythonデフォルト以外は割とどれも似たような感じですね。

  • bakerは、メソッドをつっこむだけで引数などから勝手にヘルプを作ってもらえます。何も考えずに作れるなら個人的にはこれが好きです。
  • clickは、デコレータでoptionなどを設定し、そこからヘルプを作ります。少し面倒ですが、 --is_json/--no-is_json といった boolean を --no〜 とかで False を設定できるようにしたりと、柔軟な設定が可能です。
  • Python Fireは、クラスやメソッドを投げ込む感じなので、既存のものをコマンド化するという点ではbakerに近いのかなと思います。ヘルプなどの自動生成はbakerに似てますね。

それぞれ色々な機能がありそうですが今回試した感じでは、何も考えずに既存のクラスやメソッドを入れたい!みたいな使い方をするのであれば、Python Fireは良さそうですね。

help上に String form: などPython上の情報なども出るので、Pythonを分かっている人がそのまま投げ込んで便利に使う用なのかな?と感じました。
またbash用のスクリプトを吐く、インタラクティブモードがあるなど、便利機能も組み込まれているので上手く使えれば捗りそうです。


なお、Pythonを基礎から学びたいプログラミング初心者の方はこちらをどうぞ。
paiza.jp

Pythonの講座も公開中!プログラミングが動画で学べるレッスン


paizaは、プログラミング未経験者・初心者向け学習サービス「paizaラーニングを、新サービスとして独立オープンいたしました。

今回記事の中で使用しているPythonの入門講座も好評公開中です。ぜひごらんください!

↓詳しくはこちら
paiza.jp

そして、paizaでは、Webサービス開発企業などで求められるコーディング力や、テストケースを想定する力などが問われるプログラミングスキルチェック問題も提供しています。
paiza.jp
スキルチェックに挑戦した人は、その結果によってS・A・B・C・D・Eの6段階のランクを取得できます。必要なスキルランクを取得すれば、書類選考なしで企業の求人に応募することも可能です。「自分のプログラミングスキルを客観的に知りたい」「スキルを使って転職したい」という方は、ぜひチャレンジしてみてください。

ITプログラマ・エンジニア向け転職・就活・学習サービスのpaiza


プログラミング入門講座|paizaラーニング

PHP入門編Ruby入門編Python入門編Java入門編JavaScript入門編C言語入門編C#入門編アルゴリズム入門編