Skip to content

Instantly share code, notes, and snippets.

@yusuke
Created May 17, 2018 00:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yusuke/013dced6022a1564203b348a45a51832 to your computer and use it in GitHub Desktop.
Save yusuke/013dced6022a1564203b348a45a51832 to your computer and use it in GitHub Desktop.
感想などは: #jjug
質問はタグ2つ: #jjug #q
ここにざっくり日本語訳を表示します。
こんにちは。ここにお招き頂きありがとうございます。
ゆーすけアレンジありがとう
東京、日本に来るの初めてです。
またきたい!
いつでもさえぎって質問していいですよ
主にIDEAについて話ますが、製品全般について話ます。
数日前、このスライドを書きました。
JetBrainsがどのように製品開発しているかとかよく聞かれます。
IDEだけでなく、ユースケが紹介したようなツールもありますね。
開発しているなかでルーチンワークがあれば、コードを書くことに集中できるよう、ツールを作って効率化しています。
私自身JetBrainsに入って、コードを書くことを楽しんでいます。
プログラマの皆さんも、コードを書くことを楽しんでいることと存じます。
JetBrainsツールで寄り楽しくなればうれしいな
小せぇ!!!
いろんなテクノロジーを触ってきましたよ
JetBrainsツールをある日見つけて、いかにコーディングを楽しめるかということを発見しました。
私は最近ビッグデータやサーバレスも好きです。
ちいせぇ!
全般的な話をして、最近のJetBrainsツールの新機能を紹介していきます。
時間があれば、生産性向上のコツもご紹介できれば。
それから質疑応答します。
Twitterでも質問してね。
[#jjug #q] で。
JetBrainsは19周年になります。
最初、3人ではじめました。当時のJava IDEはリファクタリングができませんでした。今では信じられませんが。
grepして置換して、とかドロくさいことをしてるともちろん簡単にコードが壊れます。
そこでデベロッパがコーディングに集中できるよう、grep置換とかしなくてすむリファクタリングツールを作ろうと決心しました。
当時、Gang of fourとかが提唱するリファクタリングの重要性も注目されていました。
最初はjDeveloperのプラグインとして、単にリネームリファクタリングをするだけのツールとしてリリースしました。
IntelliJ Renamerと言います(訳注)
19年経ち、、
あ、当初は会社名も"IntelliJ"でした。
現在では22にものぼるせいひんが人気の言語、プラットフォーム、を広範にサポートしています。
IntelliJ IDEAは仲でも人気のIDEですが、Javaを初めとするテクノロジーをサポートします。
Ultimate(有償版)はさらにPHP、Ruby、Python、WebなどJavaにとどまらないテクノロジーをサポートします。
カンファレンスではブースで各製品のステッカーを配付していますが、
「え、何ですかこの製品?」とかきかれますす。
ReShareper,IDEAのとなりのはVisual Studioのプラグインです。Visual Studioのリファクタリングやナビゲーションなどを強化するツールで大変人気があります。
DT、はdotTraceです。.NETのツールです。プロファイラです。
TeamCityはゆーすけが簡単に説明したCIツールですね。
RubyMineはRubyのIDE。Ruby on RailsとかRubymotionとかサポートします。
YouTrackは課題トラッカです。
アジャイルボードとかカンバンも使えます。
各課題のステータスをビジュアルに、物理的なボードなしに表現できます。
WebStormはJS、Web、TypeScript のIDEです。Angularといったフレームワークもサポートします。
PhpStormはPHP、PyCharmはPython、
dotCoverは.NETのカバレッジ測定ツール。
dotPeekは.NETのデコンパイラ
AppCodeはSwift、Obj-CのIDE
山形のはMPS。DSL開発/実行環境、Kの形のはKotlin。
今700を超えるデベロッパがいます。
むやみに膨らませないようにしていますが、それでもどんどん人が入っています。
ご存じかもしれませんが、Androidでデフォルトで使える言語としてGoogleが選択しました。
Android StudioでもIntelliJ IDEAの無料版でもご利用いただけるテクノロジです。
Kotlinは静的型付けの言語です。
しかしながらシンプルで、むやみに強力な機能をつけすぎないようにしてます。
シンプルかつ、安全にしているので、コードを動かす前にバグを見つけ出すこともやりやすくなっています。
また、Kotlinはマルチターゲット言語なのも重要です。
JVMでもちろん動かせる言語ですが、
素晴らしい言語なので、ほかのエリアで、
たとえばJavaScriptエコシステムにのったらうれしいですね。
JVMのバイトコードだけでなくJavaScriptにもコンパイルできます。
JVMとブラウザ両方をターゲットに、同じコードで「common module」を作ることもできます。
コードの再利用が進みます。モバイルアプリでもサーバアプリでも、フロントエンドでも。
昨年、Kotlin/Nativeというのを始めました。
Kotlinをネイティブにコンパイルして、組み込み器機で動かすことができます。
OS X、iPhoneでも、どんなプラットフォームでも動かせます。
Kotlin ConferenceのアプリのiOS版はKotlilnで書かれていました(訳注)
ここではJavaコードがあります。特別なことはありません。フィールドが3つあって、equals、hashCode、toString、getterとかあるかんじ。
大したことしてないのに2画面くらいあります。
フィールドを増やしたらtoStringとかhashCodeとか書き換えないといけません。
そして書き換え忘れてトラブルになったりします。
Kotlinではこれが、こんなにシンプルになります。
基本的にデータクラスが data classというキーワードを使って1行にまとまりました。
下にあるのはmainメソッドですちなみに。
データクラスにどんなプロパティがあるのか宣言しているだけ。toStringとかhashCodeとかはKotlinコンパイラが生成してくれます。
hashCode生成しなおしわすれて、問題おきて、Stackoverflow
をあさって・・・という必要もなくなります。
Stringってなんでしょう。charの配列みたいなものですが、nullになる可能性もありますね。
なのでどんな変数、getter、メソッドにアクセスするときも、nullチェックは欠かせません。
Javaでは。
Kotlinでは宣言時に、このStringのプロパティはnullではだめだよ、と決められます。
なので安心して使えます。
ここでemailは最後に ? がついています。
emailはnullでもいいよ、というマークです。
さらにデフォルト値を指定しておくことも出来ます。
変数の宣言時型を書く必要はありません。型推論が働くので。
ここではemailを指定していませんね。デフォルト値があるので、書かなくても大丈夫です。
コンストラクタを沢山用意刷る必要もありません。
Stringを使うとき、IDEの助けも借りながらこんなことができます。
JavaでいうString.formatを使うような感じ。
+ で文字列を結合していくのではなく、文字リテラル中に式を埋め込むことが出来ます。
emailがnullの場合、ナイスな表現にするみたいなことも出来ます。
emailが指定されていません、みたいに。
Javaで同じことをするとちょっと面倒ですよね
たいしたことではないけど、積み重ねです。
こういうのを沢山書いているうちにJavaでは間違いが起こります。
さて、リストを作ってみます。Kotlinデベロッパのリスト。
mapで、キーがデベロッパのID、valueがデベロッパのインスタンスだとして。
hashmapをつくって、リストをforループで回して・・・とかJavaではかくけど。
Kotlinではこんな風に書けます。
associateByというメソッドでキーとなるプロパティを指定したら一気にmapに変換できます。
itってのは暗黙的に定義される変数です(訳注)
キーの型が変わっても、型推論が働きます。
変数宣言の型を書き換えるような必要はありません。(Java 10でもまぁできるけど)
Javaで、こういうことやるとき、ぱっと思い付かなくて
StackOverflowのコードを貼り付けたりしますよね。中身もよく見ずに。
で、うごかないとか。
そういう積み重なりもKotlinでは避けられます。
さてmapでforEachで回して・・・、こんな風に簡単にlambdaを書けます。
エントリを回す場合、keySetでイテレートして、とかJavaの場合やるけども
Kotlinではkeyとvalueをタプルで受け取れますのでkey / valueを簡単にループで回すことが出来ます
IDEがキー、valueの型も教えてくれるので便利
さっきみたいに、テンプレートを使って簡単にプリントできます。
https://try.kotlinlang.org
とか、簡単に試せますので是非!
Javaとも親和性高いので既存のプロジェクトで、新しいコードだけKotinでかくとかもあり。(弊社-サムライズムでも実際やってます)
特に2つ以上の製品を使っている人にお勧めなのがToolbox
https://samuraism.com/jetbrains/jetbrains-toolbox-app
最新版があれば教えてくれますし、1クリックでアップデートできます。自動アップデートも可能。
最新版で問題があれば前のバージョンにロールバックするのも簡単。
IDEだけでなく、プロジェクトの一覧もでます。
このプロジェクトはあのIDEデ開いて、とかも気にしなくて大丈夫。
最近追加されたのはIDE Setting Sync。家でも会社でもIDEを使っていて、それぞれ別々のマシンを使っている場合。
すこしずつ設定が家と会社でくいちがってしまうことがあるとおもいます。
同期を有効にすればショートカットでもプラグインでも、全部設定を同期できますので同じように操作できます。
IDEAがコードを静的解析する機能が強化されています。
このコードではforループがあって、配列の最後まで回します。
iがargs.lengthより小さい場合、って式がありますが、静的解析でここはかならずtrueだと判別できます。
人間ではなく機械的に判別しているので確実。
一発でこの式を消すことも出来ます。
ストリームAPIで、Stringインスタンスだけを絞り込みます。
Objects.notnullは確実にtrueなので不要なコードだと指摘してくれます。
コードが短くなり、間違いも減ります。
個人的によく見かけるのがmutableなarray listとか使います。
変更できないようにするんだけども
間違えてそこに要素を追加しちゃう。
実行時に例外でるけれども、
すぐに問題が発生するとは限りません。
1ヶ月後とかに問題が発生して大変な事態になりがち。
でもaddシテイル箇所とか検出して警告してくれます。
aに1を入れ、次に2を入れる。
コンパイル通るけど、ナンセンスなのでバグである可能性ありますね。
Java8のストリームAPI、使いますよね?
でも色々問題も起こしがちです。
ここでは無限のランダムのストリームを作り、プリントしてます。
正しいコードだけど、無限に実行されます。
意図的であればいいんだけど、そうでない場合がおおい・・かな?
数列10個まで、としていすれば警告なくなります。
mapにいろいろ足していく場合
間違えて同じkeyで複数の値をputする
やりがちだけどもおかしいよ、と指摘してくれます。
意図的にやっているケースであればそこだけ警告を抑止することもできます。
IDEがなにかおかしいと教えてくれます
動かしたらかならずIndexOutOfBoundsExceptionが出ます。
自分出書いたコードなら、このブロックの条件わかってるんでこんなことしないかも。
でも他の人からは自明出ない場合があるんでこういう間違い起こしがちです。
IDEAは、独自のアノテーションで、コードの規約を、たとえばこのパラメータはnull渡しちゃだめだよ、とか定義できます。
Kotlinみたいにね。
それでNPEを回避できます。
標準APIにアノテーションを追加することはできませんが、データのフローを解析することで、標準APIでどこでnullを使えるのか使えないのか解析して、
だめなところに警告を出してくれます。
コードを良くみればnullを渡したらだめなことわかりますが、IDEが機械的に識別して、null許容しないよ、null渡してるダメだね!と警告してくれますのでNPEを回避できます。
ここでは、まぁコードは問題ないです。動きます。
whileループで特定の条件で抜ける。
でも第三者からみると、ひどい
じっくり読まないと何がおきるかわからないし、下手に書き換えると無限ループになります。
IDEが、これもっとキレイに書けるでしょ、と指摘してくれ、瞬時に直してくれます。
do-whileを使って読みやすく、メンテナンスしやすくなりましたね。
ここではtry-with-resourceをつかってます。
なんとなく、closeを念の為書いたりとかするかもしれませんが、
いらないよ、と指摘してくれますし、クイックフィックスで修正できます。
データクラスつくるの、面倒ですよね。
で、おかしいところ発見してくれます。
コピーコンストラクタなんだけどこれは、
コピーし忘れているフィールドがあります。
ちゃんと書けば警告消えます。
ここではまたストリームAPIで、
objectからstringインスタンスを抽出してます
mapの中では、すでにこれはstringだとわかるので、Stringのメソッドも補完対象になります。
がんばってキャストしなくていいです
補完確定するとキャストする部分も勝手に書いてくれます。
postfix completion
皆さん少なくとも1つはあたらしいことを今日学ぶことになりますね!
コード補完していって・・あ、ここで配列をリストにしたい、と思ったら
カーソルを戻して、
えーとなんだっけ・・・
arraysのasListか、とか
カッコ必要だな、とか思い出して、
さて何がしたいんだっけ?ってなる
IDEAではカーソルもどさず、リストにしてー!って書けばさくっとリストに変換してくれます。まさに変態!
続いて、要素をイテレートするとき、またカーソルもどして・・・
あ、必要ないか。
ジョインしたかったら、joinとかタイプしたらcollectとか必要なコードを埋めてくれます。
これを変数にいれようと思ったら、.varを書き続ければそのまま変数宣言もしてくれます。
あとは、今書いている式をプリントしよう!と思い立ったら.soutと書けばSystem.out.printlnで囲ってくれます。
デバッグするとき、何百回も呼ばれる箇所をデバッグするんだけどブレークポイントで毎回止まったら面倒ですよね
ここでどこからこのコンストラクタがよばれているんだろう、と確認したいとき
ブレークポイントに到達したさい、プログラムを止めずにスタックトレースを出せます。
コードを書き換えること無く
すでにブレークポイントで止まっているけど、特定の問題を再現するため例外が欲しい!
そんなとき、人工的に例外を投げることも出来ます
テストケース作るのが難しい例外パスの確認とかに便利
ユースケがカバーしたかもしれませんがパーシャルコミットもできますよ
(してない)
コード内に複数箇所の変更がある場合
ガター(コード横)でどこが変更されたのか確認出来ます。
別のチェンジリストに、特定の変更箇所を移動すればそこだけ今回はコミットしない、とかできます。
ここはコミットされません。
現在のチェンジリストにもどせばほら。
チェックをはずして対象から外すことも出来ます。
面倒なコードですね。
さくっとナイスに書き換えられます。
インライン化も一瞬。
ユーティリティクラスで、非推奨化したメソッドがあります。
alt + enterで、さくっと推奨メソッドに書き換えられます。
プロジェクト全体で書き換えることも可能。
ここではコントローラのメソッドで、エンドポイントが定義されてます。
jsonでもxmlでもリクエストできますここでは。
ちょっと起動してみましょう。
このAPIを呼び出すのが簡単ですよ
自分でアクセスするとしたらホスト、ポート、パスなど色々意識する必要ありますよね
複雑です。が、再生ボタンがあるんで、クリックして、呼びたいエンドポイントを選択するだけ
そしたらリクエストをしてレスポンスもダンプしてくれます。
Spring Bootではメソッド内の書き換え程度であればホットリロードできます。
IDEからもそのアクションを呼び出せますので、コードを修正して、すぐに試すことが出来ます。
リクエスト内容を調整したい場合は、こんなエディタを開いて、サクットさらにリクエスト出来ます。
レスポンスも補完されます。
これはスクラッチファイルという形で補完されているのでプロジェクトのリポジトリを汚すことはありません。
自分で.httpファイルを作る琴も出来ます
gtrって書けばgetリクエストのテンプレートが展開されます。
ヘッダをつけてみたり
パラメータをつけたり
で、実行できます
curlとかでもできるかもしれないけど
jsonをpostするとかマジムリ
POSTもサクット定義できます。
jsonもちゃんとバリデートしてくれますのでwell-formedなjsonを簡単に書けます。
外部jsonファイルをpostに使うことも出来ます。
簡単にhttpためせます。IDEを離れることなく。
ターミナルといえば
IDEに組み込まれています
私のお勧めは、プラットフォームに限らず、fish shellを使うことです。
シンタックスハイライト、コード補完など便利
ターミナルのデフォルトシェルとして設定するだけ
補完してくれたり、パラメータとかよくわすれがちなのも、サジェストしてくれたり、
ヘルプが出たり
最後に使ったパラメータをサジェストしてくれたり
時間・・・・。
最近のタッチバー付きのMac、次期バージョンでは、いろんなアクションをコンテクストに応じてタッチバーにボタンを表示してくれるんで、ちゃんと活用できますよ!
varのサポートも強化されています。
gradleサポートも強化。
カスタムタスク、プラグインを書く場合、ビルドファイルと自分のカスタムファイルの相関関係を認識してくれるのでジャンプできます。
デバッグも出来ます。build.gradleファイル内でブレークポイントを張って、ステップイントゥーもできます。
(ずいぶん細かい機能を・・・)
appendのメソッドチェーンなら、
よりインテリジェントにジョインするよ!
ifがネストしているところジョインしたら、分かりやすくなりますね。
一種のリファクタリングもしてくれる
是非おためしください。他にも沢山便利な機能が!
昨日でたEAPバージョンはβリリースだけど無料で試せるよ
デベロッパ以外にももちろんセールス、マーケティング、など沢山いますよ。QAもデザイナーも。サポートエンジアもテクニカルライターも。
特に比較とかはしてないです
レスポンスにこういうのがあるべき、とか定義してテストできるようにしたいね
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment