【Can't resolve symbol エラー】もしかしてそれフィールドだったりしません...?

アホみたいだけどホントの話.

技術書を読んでいて出てくるコードのスニペット(一部分だけを切り出してあるあれね)を動かそうとすることがよくある. で,IDE立ち上げて1,テキトーにパッケージ切って,クラス名はまあMainでいっか,てな具合にMain.java作って...で,写経をし始めると,怒られる.

Can't resolve symbol ~ だとさ.

あれ,このメソッドないんだっけ...?とAPIを確認しにいったり,写経ミスを疑ったりするのだけれども,わからない.

........

で,しばらくして気づいた. あ,public static void main(String[] args)(メインメソッド)の記述忘れて,ここフィールドじゃないすか...orz

ということで,メインメソッドをはじめに書く癖をつけましょう. 自分はMainでクラスを作成するのでメインメソッドも作った気になってしまうのだと思います...

メインメソッドはたいていのIDEで自動補完がサポートされているはずなので,それを使いましょう. IntelliJでは「psvm」と書いてEnterするだけです. ちなみにメインメソッドを自力で書こうとして,例えばString[] argsを忘れるみたいなミスをすると,メインメソッドとして認識されないので,やはり自動補完がオススメです.(←これも経験あり...)

f:id:weekend_warrior:20200922231049p:plain
psvmとタイプするだけでOK(IntelliJの例)


  1. Java9以上なら「JShell使えばいいんじゃね?」という気もするが,ライブラリのパスを通して起動するのもめんどくさかったりするので…

IntelliJでMavenプロジェクトが認識されずに困った

環境

IntelliJ IDEA COMMUNITY 2020.1
ですが,これの一つ前の2019.3(だったかな?)でも同様の現象発生

症状

Mavenプロジェクトが認識されない”と書きましたが,具体的には次のような症状がありました.

  • Javaコードに明らかな文法エラーがある(例 ;のあとに適当な文字列)にもかかわらず,赤波線が出ない
  • クラスを追加しようと右クリックしてもNewのあとファイルしか表示されず,Javaクラスが追加できない(すでにあるクラスもアイコンがおかしい)
  • main/javatest/javaディレクトリアイコンに青や緑の色がつかない
  • 自力で↑のディレクトリをマークするとJavaコードは認識されるが,pom.xmlに記載されているライブラリが認識されず赤波線が大量出現

解決方法

次のステップを踏んで無事解決〜 (ステップ0は不要かもしれません)

  • ステップ0: IntelliJの起動画面の左側に出てくるプロジェクト履歴から該当プロジェクトを削除(❌ボタンをクリック)
  • ステップ1: Mavenプロジェクトの.ideaディレクトリを削除
  • ステップ2: IntelliJの起動画面からプロジェクトをimportする

キモはステップ1ですね. ここの情報がとても参考になりました!

intellij-support.jetbrains.com

それでも動かないときは...Mavenプラグインを確認せよ!

はい,私の場合はこれでも解決しませんでした.まだライブラリがないと言われて怒られます.

そんなときは,MavenプラグインがInteliJで有効になっていることを確かめます. 実は,3rdパーティ製のMavenプラグインを入れていたみたいで,そのためかもともとデフォルトで入っているMavenプラグインがOFFになっていたみたいです.

Preferences → Build, Execution, Deployment → Build ToolsでMavenが出てくればOK.

管理されてないpomがあるぜぃ(意訳)

「なんか知らないpomファイルがあるよ」って右下にポップアップが...!! もちろん,管理下に入れてもらいました.

それでもって,まだ解決しないのでもう一度.ideaを消して...を半分キレながらやっていたら... ようやく認識されるようになりました!!

はあ〜貴重なプライベートの開発時間をこういう問題で取られるのはホントにムカつきますね...

and/orを使って複数条件で判定したらおかしな結果になった(Python)

orを使って条件判定したらおかしなことになった,あるある話.環境は3.7です.

あれ? そなたはNoneTypeではなかったか...

あるオブジェクトの型がlist, tuple, setのいずれかであるかを判定したかったので,次のようなコードを書いた.

def check(obj):
    if type(obj) is list or tuple or set:  # 型判定(のつもり)
        print('OK!')
    else:
        print('NG...')

引数のobjNoneが入っていたのだけれど,なんとシーケンス型だと言うではないか!

>>> check(None)
OK!

お,おう...

評価の結果は...

andやorの後に続くのは条件式であり,たとえオブジェクトであったとしてもTrueもしくはFalseのどちらかとして評価されてしまう. つまり上のコードでは,type(None) is listtuplesetのいずれかがTrueであれば,ifブロックが実行されることになる.

TrueもしくはFalseのどちらに評価されるかはbool()を使って調べることができる.

>>> bool(type(None) is list)
False
>>> bool(tuple)
True
>>> bool(set)
True

つまり,常にifブロックが実行されてしまうことがわかった.
if tupleとかで条件式が成立してしまうんだね...何気に怖い.

正しい判定コード

というわけで,書き直したコードがこちら.

def check(obj):
    if type(obj) is list or type(obj) is tuple or type(obj) is set:
        print('OK!')
    else:
        print('NG...')

>>> check_sequence(None)
NG...

>>> check([])
OK!

>>> check((1,))
OK!

まとめ:and/orのあとは条件式

はじめはわかっているつもりでも「なんかこれでいけるんじゃない?」「むしろPythonistaっぽくない??」 という謎のPythonならありえそう」感が出てきてしまってやらかしてしまった. 気をつけませう.

PyhonとRどっちがオススメ?RからPythonに乗り換えた理由

データ分析や機械学習と言えばPythonですよね?いやいや,それともR? 私はもともとRを使っていたのですが,3年ほど前から徐々にPythonに乗り換えて現在はPythonを使っています.

f:id:weekend_warrior:20190825015156j:plain

なんでRを始めたか?

同調圧力ですね.周りがみんなRを使っている,データ分析を始めたとき,そういう環境だったからです. すでにPythonに慣れている状況でしたらそのまま使いつづけたでしょうが,そのときはRもPythonも触れたことがありませんでした.時期的には2013年あたりで,ちょっとずつデータ分析や機械学習がバズり始めたかな?という感じでした. わざわざ自分だけ違うツールを選んでもなにか困ったときに周りに教えてもらうこともできないし,コードも共有できないし,ということでRを選択.

なんで乗り換えたのか?

データ分析や機械学習に縛られないから

Pythonはなにもデータ分析や機械学習に特化した言語ではありません. 「これはPythonの方がいいのかも...」と思い始めたのは,Rで分析した結果をGUIアプリにしてほしいと言われたときでした. RでもWebアプリやGUIを開発できるShinyというフレームワークがあるのだけれど, データ分析やMLを使用しない通常のWebアプリ開発に,わざわざR(Shiny)で開発することはないだろうと判断. つまり,「Shinyを頑張ってマスター」より「Pythonでデータ分析+Web開発をマスター」の方が学習コストはもちろん高いですが,メリットも多いだろうと思ったのです.

Deep LearningPythonが有利だから

もはや避けては通れないDeep Learning(深層学習).Deep LearningのライブラリはPythonを対象にしていることが多いです. kerasライブラリがRにも対応しているみたいですが,やっぱり世の中的にはヘビです. 個人的にはDeep Learningの勢いがつくにつれてPython人気が高まっていったようにも感じています.

書籍もネット上の情報もPythonだらけです. 上に書いた「なんでRを始めたか?」とも同じですが,周りと同じツールを使うとキャッチできる情報量が増えます.このメリットは大きいです.

乗り換えて大変だったこと

いまだに正しくrangeを使ったforループが書けなくてPyCharmに怒られてます. まあ,複数言語使いのあるあるかもしれません...

「Rは1オリジンでPythonは0オリジン」というのも有名な違いですが,こちらはあまり混乱しませんでした.0オリジンのJavaを使っているからかもしれません.1オリジンという異端者が消えてむしろよかったってことなんでしょう...

今から勉強を始めるなら...断然Pythonで!

というわけで,今からデータ分析や機械学習や始める人にはPythonをオススメします.というかオススメしなくてもPythonだと思いますが笑

R, I still love you!

自分にとっては初めてのスクリプト言語で,プログラミングが楽しいって思えるようになったのはRのおかげです. IDEのRStudioもめっちゃ好き.Python使えるようにしてくれないかな...ってくらい好き.

一時はRstudioっぽいIDEがないか必死に探してました笑

weekendwarrior.hatenablog.com

現在は,PyCharmやJupyter Notebookを使っています. (Jupyter Notebookはどんな変数が存在しているか常時一覧で出してくれないので嫌い)

あと,初対面のR使いさんとは「最近Rってどうなんでしょう〜?」と話のネタになります笑 ということで,Rを使っていたことは後悔していません...!

プログラミングの勉強を続けるコツ!モチベーション維持できるオススメ題材6選

プログラミングの勉強を始めたきっかけは人それぞれだと思いますが,目標がないとなかなか勉強を続けられないものです.

ということで,プログラミングの勉強を続けるための題材を紹介したいと思います.

競技プログラミング(競プロ)

f:id:weekend_warrior:20190824164753j:plain

与えられた問題に対して,答えとなるコードを提出します.提出したコードにテストケースが入力され,すべてのケースで正しい出力を出すことができれば,その問題をパスできます(メモリや実行時間に制限が設けられることが多いです).

メリット

アルゴリズムに強くなる

競技プログラミングでは,与えられたお題を解くアルゴリズムを考えてそれを正しく実装するスキルが求められます.さすがにソートを自力実装することはないでしょうが,鍛えたスキルは通常のソフトウェア開発でも役に立ちます.

自分の実力が目に見える

「競技」ですから勝敗つまりランキングが存在します.他人と競争すると燃えるぜっていう人にはうってつけです,

就職や転職で有利になるかも

入社希望者のスキルを測る手段にも利用されています.「競技」ではないですが,掲載された問題にコードを提出すると,それをスキル証明として利用できる転職サイトもあります.

デメリット

何かモノが完成するわけではない

当たり前ですねw   純粋にプログラミングが好きって気持ちが少しでもないときついかも.

ソフトウェア設計,開発スキルは身につけにくい

与えられた条件を満たすコードを書きさえすればいいので,保守性や可読性がボロボロであってもいいし,別にすべての処理をmain関数の中で一括して書いてもいいわけです.むしろ,実行速度やメモリ量が命の場合は,そんなこと気にしてたら勝てない場合も.ライブラリも使えないし,入力もすべて標準入力で通常企業で開発されるソフトウェアとは環境が大きく異なります.設計や開発スキルは別の方法で身につけましょう.

こんな人にオススメ

電子工作・ロボット

f:id:weekend_warrior:20190824163558j:plain 最近はIoTや安価なマイコンRaspberryPiが普及したことで興味を持っている人も増えているのではないでしょうか?

メリット

動くモノが作れる

ソフトウェアの世界に閉じず,LEDを点灯させたり(俗にいうLチカ),モータを動かしたり,スピーカから音楽流したり,カメラで写真撮影したり,Amazonエコーのようなスマートスピーカと連動したり...

どんなデバイスを作って,どんな制御をしてみたいですか?

電子工作の知識を身につけられる

プログラミングの世界に閉じていては得られない知識です.

デメリット

プログラミング以外に電子工作の知識や作業が必要

上に書いたメリットの裏返しになってしまいますが,プログラミングとは直接関係のない電子工作の知識や作業がかかせません.わからないことは勉強しながら進める覚悟がいります.

ただし,「デバイスや家電を制御してみたい」という場合,必ずしも電子工作等に詳しくなくても大丈夫です. 最近はIoTに対応したデバイスも多く出回っており,APIが公開されていれば自由度は低くなってしまいますが,デバイスを制御するプログラムを作ることは可能です.

部品調達にお金がかかる

電子工作には工作部品が必要です. LEDや抵抗,ジャンパーピンなどの部品は数十~数百円とかで買えますが,電子工作書籍の通りに作ろうとして部品を全部揃えると万単位の出費になることも... また,実験や試作品開発レベルではブレッドボードに部品をプスプスさせばいいですが,しっかり作品として仕上げるにはハンダづけも避けては通れません,というかやりたくなります! テスターなんかもそのうち欲しくなるはず.

RaspberryPi Zeroも本体だけみると安く感じますが,SDカードやディスプレイに接続するためのケーブルなどをいろいろ揃えているとそれなりのお値段になります.

こんな人にオススメ

  • 電子工作の経験や興味がある
  • 多少の出費は惜しまない
  • 解決したい問題や作りたいモノ,やりたいことがある

自分のためのWebサービス,アプリ,システム開発

f:id:weekend_warrior:20190824213620j:plain

自分の手でサービスやアプリを作るってワクワクしませんか...?

メリット

フレームワークやライブラリ,データベースをマスターする練習になる

企業でのソフトウェア開発がプログラミング言語の標準APIだけで完結することはないと言っていいでしょう.フレームワークなりOSSのライブラリを活用していますし,データを保存するデータベースがないと成り立たないシステムがほとんどです.これらを使って開発する練習になります.

作った作品は就職や転職時にポートフォリオとしてアピールできます.特定のフレームワークの使用経験が求められている場合にはよいアピール材料になるはず...

他の人にも使ってもらえる

便利なサービスや面白いアプリができたら家族や友達など他の人にも使ってもらいたいですよね. HerokuやPythonAnywhereなど,サーバを持っていなくても作ったWebアプリを無料で公開できるサービスもあります.

デメリット

フレームワークがありすぎて迷う

特にまだ学習したいフレームワークが決まっていない場合には,どれを使えばいいか迷ってしまうかもしれません, 例えばJavaシステム開発するためのフレームワークだと... - Spring - Struts - JavaServer Faces(JSF) - PlayFramework - Apache Wicket などなど,非常に多く存在します.

学習コストが少ない(=少しの勉強で使えるようになる)フレームワークや今後も使われる可能性が高いフレームワークを選んで学習しましょう. どのフレームワークが人気があるのかわからない場合には,あくまでも目安としてですが,Googleトレンドで検索具合を調べてみるのも一案です.

自分が「使いたい!欲しい!」と思えないと続かない

他の人からの「作って」でもいいですが,とにかく使ってくれる人がいないとモチベーションが下がります. それにだいたいのものは,この世の中ネットで探せば見つかります(しかも無料でクオリティもGOOD). 「どうしても自分でこれを作るんだ!」という熱い想いを持ってやりましょう,

こんな人にオススメ

  • Web技術やアプリ開発に興味がある
  • 業務の都合で習得したいライブラリやフレームワーク,データベースなどがある
  • 実用性のある作品やサービスを作りたい
  • インターネット経由で作品を公開したい,アプリやソフトとして配布したい

データ分析・機械学習

f:id:weekend_warrior:20190824213644j:plain 何かと話題のデータ分析・機械学習.プログラミングと一緒にこれらのスキルも習得しておくのはどうでしょう?

メリット

情報が多く始めやすい

近年の機械学習ブームのため,書籍やインターネットでの情報がたくさんあります.また,Googleアカウントを持っていればGoogle Drive上でGPU環境が利用できるGoogle Colabratoryを使うこともできるようになりました.非常に取り組みやすいご時世になっています.

デメリット

言語が限られる

2019年現在,データ分析や機械学習といえばPythonです(次点でR). 残念ながらそれ以外の言語を勉強したい人にとってはあまりよい題材ではありません.

データ分析に必要なスキルに特化しがち

データ分析をやる上で必ずしも必要とはいえないスキルはどうしても身につけにくいです,例えば,Pythonオブジェクト指向でプログラムを書くことができますが,「理解していないとデータ分析できない」なんてことはありません,その他,マルチスレッドやデザインパターンなどの知識もデータ分析だけでは身につけにくいと言えます.

こんな人にオススメ

  • データ分析,データサイエンス,機械学習,AIに興味がある
  • PythonやRを習得したい
  • グラフをプログラミングで作成したい
  • ちょっとした表計算をプログラミングでやりたい

イベントやコミュニティに参加する

f:id:weekend_warrior:20190824163938j:plain 一人ではモチベーションが続かない...なんて人には 例えば

  • ハッカソン(「アイディアはあるけど開発者だけ募集」なんてイベントもあります)
  • 勉強会の講師/メンターを務める

などはどうでしょう?

メリット

なじみのないツールや開発手法を勉強できる(かも)

普段は会うことがない人たちと開発するわけですから,新しいツールや開発手法に触れるチャンスがあります.

同じ言語や分野に興味がある仲間が見つかる(かも)

イベントやコミュニティにはなにかしらテーマや目的があることがほとんどです. 興味のあるものに参加することで自分の興味と共通項のある人と出会えるきっかけになるはずです,

デメリット

機会が限られる

都市部では比較的コミュニティを探しやすいですが,地方だと難しいかもしれません.

こんな人にオススメ

  • 共同開発してスケールの大きなソフトウェアを作ってみたい
  • GitやGitHubなど共同開発のためのツールを実践で学びたい
  • とーもだちひゃっくにん,でっきるかな?

資格取得を目指す

f:id:weekend_warrior:20190824164554j:plain

メリット

ゴールが明確

自分で作品やアプリを作る場合と違い,「合格」というはっきりとした目標を設定できるのはメリットでしょう,

知識を体系的に整理できる

日常的にその言語を使っているとはいえ,どうしても業務での開発内容に引っ張られて使わないAPIがあったり,そもそも自分が理解してなくて使えていない書き方とかがあるはずなんです,「試験範囲だから」という理由で自分が知らないことを身につけられるのは,資格取得に向けた勉強だからこそ得られるメリットです.

デメリット

漠然と勉強してもお金と時間がムダに

受験料がかなり高額だったり,普段バリバリ買いている人でも対策しないと合格できない試験もあります.目的があいまいなまま漫然と勉強するのはお金と時間をどぶに捨てるようなものですのでやめましょう.

手前味噌ですが,Java Sliverについての受験体験はこちら:

weekendwarrior.hatenablog.com

やっぱり資格だけじゃダメ

プログラムが書けてなんぼです.特に知名度が低い資格や試験の場合は,履歴書でアピってもスキルの証明になりません. 資格持ってるだけじゃだめ,ゼッタイ.

こんな人にオススメ

  • 自分の知識範囲を広げたい
  • 自分で作りたいモノがないけど勉強しないといけない
  • お金を払って自分にプレッシャーをかけたい

まとめ

長くなってしまいましたが,それぞれの題材でプログラミングを勉強する際のメリット,デメリットをまとめました. 自分の勉強目的や興味にあった題材を見つけて楽しくスキルを磨いてください! それぞれの特徴を考えていくつかの題材を組み合わせるのもオススメ.