プログラミング・IT・英語・数学とか

英検1級、TOEIC満点(990点)、セキュリティスペシャリスト、DBスペシャリスト、ネットワークスペシャリスト。英語とITとか。いろいろ試してみたことを書いていきます

やっとわかった!pandas.DataFrame.isna() と pandas.DataFrame.isnull() の違い

pandas.DataFrame.isna() と pandas.DataFrame.isnull() の違い

どちらもまったく同じことをする関数です。ドキュメントも同じだし、ソースからもわかります。

では、なぜ2つあるのか?

短く言えば、pandas が R と numpy のどちらも真似ようとしているからです。

pands の DataFrame は R の DataFrame を真似して作られています。R には na と null があるので、それを真似して pandas でも isna() と isnull() ができました。

が、pandas は numpy をもとにして作られています。numpy には na と null はなく、 NaNしかありません。なので、pandas でも na や null ではなく NaN を使います。

よって、pandas にはデータタイプは NaN しかないけれど、判定するための関数は isna() と isnull() の2つが存在するようになりました。

参考

ほぼ以下の丸コピです。

datascience.stackexchange.com

flexboxの勉強にオススメなサイト:FLEXBOX FROGGY

flexboxの勉強にオススメなサイト:FLEXBOX FROGGY

そろそろ本格的にフロントエンドの勉強をしたくていろいろ見ていて以下のサイトを発見。

flexboxfroggy.com

今の時代はflexboxというものを使ってHTML部品を配置するのが人気らしい。なんか自分はfloatとか使ってる時代を少しだけ知ってるけど、もうそんなことしなくても良いんですね。

全24問でflexboxについての基本が学べるとてもおもしろいサイト。

実際に手を動かしながら学べるから、身につく身につく。

自分は読んでるだけだとすぐに眠くなっちゃうから、こういう方が勉強になる。

長さも24問で飽きなくて良い感じ。自分は1~2時間で全部できました。

ぜひどうぞ。(自分は24問目は解けなかったのは内緒。。。答えをググっちゃったけど、ちゃんとサイトに書かれてるポップアップのヘルプを読めば書いてあった。。。)

【やってみた】アルゴリズム実技検定(のサンプル練習問題)をやってみた。

アルゴリズム実技検定(のサンプル練習問題)をやってみた

最近ニュースになっていた、アルゴリズム実技検定。なんでも実践的なプログラミングスキルを測ることができるらしい。ふむふむ。

これでもプログラマーとして7年ほど働いてきたわたくし、どんなものかやっぱり気になります。(ずっとウェブアプリの開発保守でした)

ただ、試験自体はまだ始まっていないようなので、公開されている練習問題をやってみました。

軽く書くはずが、めっちゃ長くなってしまったので、時間ない人は最後のまとめだけどうぞ。

アルゴリズム実技検定とは

一応。
このページに行き着いた人はもう知っていることとは思いますが、プログラミングコンテストを運営するAtCoderが今月から開始する、「『アルゴリズムをデザインしコーディングする能力(=1からプログラミングをできる能力)』を測る」(公式サイトより引用)検定です。

公式サイトはこちら↓
https://past.atcoder.jp/

練習問題

まだ試験自体は始まっていないので、サンプル問題をやってみます。問題はここから見られます。↓
https://atcoder.jp/contests/past-sample/tasks

実際にやってみた感想。本当にプログラミング能力を測ることはできるのか?

サンプル問題の難易度は?

ここ数日間でサンプル問題に取り組んでみましたが、まず問題の率直な感想を言うと、サンプル問題、めっちゃ難しいです・・・w

「いや、なにこれw え、みんな、この問題とかスラスラ解けるの・・・??」って感じで、できなすぎて笑えて涙が出てくるくらい難しかったです自分には。解けなすぎてびっくりしましたよ、ほんと。

最初の1、2、3問目は楽勝。だったのですが、そのあと急激に難しくなり、F - Green Binからまったく解けません・・・。「7年の経験が・・・」、とか言ってた自分を殴ってやりたい。

難易度は適切か?

これはどんな業界でプログラミングに関わるのかによりますが、おそらく、ほとんどの業界でここまで高度なアルゴリズムの理解は必要ないと思います。少なくても、自分が関わってきたウェブアプリ系の仕事ではここまでシビアな実行時間制限とメモリ制限について考慮しなければいけないことはありませんでした。

もちろん、知っておいて損はないと思います。効率の良いアルゴリズムを知っている方が良いに決まっていますから。すごいシビアな制限がある業界で働きたいのであれば必要かもしれません。(どういう業界かはわかりませんが・・・。ビッグデータを扱う業界とかなのかな?)

本当にプログラミング能力を測れるのか?

難しさはさておき、この検定が実践的なプログラミングスキルを測ることができるのかというと、もし、本試験がサンプル問題のような形式であれば、自分は、できると思います。

正直、問題を全部解ける必要はないと思います。自分は全然解けなかったでしたしw

ただ、最低でも1~3問目くらいはすぐに解けないと「自分はプログラミングできる」とは言ってはいけないレベルだと思います。日本語を読んで問題を理解する力、解決策を考える力、それをプログラミングにできる力、わからないことは時間内に調べられる力、といった力を測るのにはとても役立つと思います。これらの力はとても根本的で大事な力です。そういった意味で、できる人とできない人を分けるのにはとても有効だと思います。

そして全問解けた人、それはもうものすんごいプログラミングスキルを持った人だと思います。スーパープログラマーですほんと。きっと足の指でもキーボード打てる人です。まじすごい、尊敬です。

アルゴリズム実技検定できる != プログラマーとして成功できる

ただ、「おーし、全部問題とけたぜー!ひょーい、プログラマーとして成功間違いないぜー!」っていうと、ちょっと違うんだと思います。あ、別に自分ができないからって難癖つけてるわけじゃないです、念の為。

というのも、効率良いプログラムを作ることも大事ですが、それと同じくらいかそれより大切なことがあるんです。

例えば、効率が悪くなるけど、ちゃんと部品が分けられてて再利用がしやすかったり、わかりやすいアルゴリズムを使っててスキル低い人でも保守できたり、コメントとかdocstringとかjavadocとかちゃんとついてたり、変数名や関数名がわかりやすかったり、とかです。こういうのはアルゴリズム実技検定では評価対象にならないと思います。

だって嫌じゃないですか?めっちゃできるプログラマーで書くプログラムはすんごい速いし正確だけど、読んでもまったく意味のわからなかったり、後から変更するのが大変だったりするのは。自分は正直それは一緒に働きたくないですw

やっぱ他の人のことを考えたり、全体を考えたりすることも大事なんです。そういうのはこの試験では測れないでしょう。

そして、効率の良いのはもちろん大事なこともありますが、ほぼほぼ、そんなシビアな場面ってないと思います。今は(お金を少し出せば)CPUパワーはあるし、メモリはいっぱいあるし、ディスクも比較的簡単に追加できるし、自分で考えなくてもいろいろな効率の良いライブラリーはあるし。頑張って効率の良いアルゴリズムを自前で考えるよりも少しだけお金を出してメモリとかディスクとか製品を買っちゃった方が逆に安くなることもあります。というかたぶんそっちのケースの方が多いと思います。

また、プログラミング以外にプログラマーはやることがたくさんあります。資料作ったり、新しい技術の調査したり、テスト仕様書書いたりテスト実施したり、運用保守したり、手でデータ直したり、ライブラリのアップデートしたり、タスクの優先度決めたり、会議したり、etc。
それこそプログラミングはプログラマーの業務のたった1つにすぎません。効率の良いプログラムを書く、というのは、さらにそれの一部分に過ぎません。

アルゴリズム実技検定はあまり意味ない?

「じゃぁ、アルゴリズム実技検定って、あまり意味ないの??」って思うかもしれませんが、それは違うと思うんです。

大事なのは、この検定が、自分の今の実力を知り、さらに自分を良くするきっかけになるってことだと思うんです。

この実際に自分がサンプル問題に取り組んで思ったのは、自分はまだまだ知らないアルゴリズムがあるんだな、自分の知らないpythonの機能がまだまだたくさんあるんだな(自分はpythonでやりました)、自分は解けなかったけど他の人はこんなにも正解している人がいるんだな、こんな解決案は思いつかなかった、なんで思いつかなかったんだ!あと一歩だったのに!、と、いろいろな気付きが得られたことにあるんだと思います。

とりあえず受けることが大事だと思うんです。受けてみて初めてわかることってあると思うんです。プログラミングも一緒です。実際に書いてみないとわからないんです。

なんにせよ、アルゴリズム実技検定、受けてみるのがいいと思います。サンプル問題やってみて、自分は受けようと思いました。

あ、いや、受験を勧めてますが、別に自分はAtCoderからお金もらってるわけじゃないですよ。上のリンクをクリックして申し込みしても僕には1円も入りません、悲しいですが。

受けてみて、結果が良かったら「どや!自分はできるやつなんやで!」って自信つくし、結果が良くなくても、これから良くなるきっかけになります。受験料 8,800円 ですし、安いものだと思います。

ぜひ、自分のために受けてみるのが良いのではないでしょうか。

と、無理やりまとめてみたところで、w

まとめ

  • サンプル問題めちゃ難しい!数日間かけたけど自分は半分も解けなかった・・・。(それか俺の能力低いのか・・・?)
  • サンプル問題の3問目くらい解ければだいたいの人は良いと思う!(開き直りじゃないよ)
  • 逆に、3問目くらいまですらっと解けないと、おそらくあまりプログラミング能力高くないと思う。
  • ただ、全問正解した人でも気をつけて!ITで働くには他の大事な要素もあるから。(・・・いや、ほんと、ひがんでるわけじゃないよ)
  • 純粋なプログラミング能力を知るのにはとても良いと思う。そして、知らないことがまだまだたくさんあると自覚でき、スキルアップを目指すきっかけとしては、とても素晴らしい検定だと思います!

【アジア旅行】仕事を辞めてアジアを数ヶ月放浪することにしてみました。とりあえず最初はベトナムに行こうと思い、片道航空券とe-visaを取ってみました。

4年間くらい勤めた現場と会社を辞めて、数ヶ月くらいアジアを放浪することにしました。やめるのは2019年12月末。アジアに行くのは来年1月24日。

どっちかって言うと、辞めるっていうのが目的で、時間が余ったから旅しようかなって感じ。

とくになんでアジアという理由はないのだけれど、しいていえば行ったことがないから。あとは物価が安そうで、BTC信用取引で軍資金を失ってしまった後の心もとない自分の予算でも数ヶ月くらい旅できそうだから。

とりあえずどこの国から行っても良かったんだけど、なんとなくTinderで会ったことのあるベトナム人の子が勧めてくれたのでベトナムから行こうと決めてみました。
なんか美人が多いって書いてあるのをネットで見つけたのも理由の1つでで。

いつ帰ってくるかわからないので航空券は片道を購入。

そしたら、ビザがない場合、片道航空券では入国を拒否されるかもしれないという、いろいろな記事を見てビビり、即E-VISAなるものをオンラインで申請。これがあるとベトナムに入国できて30日間滞在できるらしい。知らなかったよ。調べてよかったよかった。いやー怖いね世間知らずって。
ビザなし+片道航空券でも入国するときに聞かれることはないので、まぁ大丈夫、って書いてあるブログとかあるのは見たけど、さすがにベトナム到着して入国できませんっていうのはテンションガタ落ちになるのでビザ取りました。
↓で申請できますよ。(変わってたらごめんなさい)
https://evisa.xuatnhapcanh.gov.vn/en_US/web/guest/khai-thi-thuc-dien-tu/cap-thi-thuc-dien-tu

それにビザはめっちゃかんたんに取れたし、これは取っておいたほうがいい。心の平穏のためにも。ビザ申請って聞くと難しそうだけど、すごく簡単だし。自分は20分くらいで全部できました。あとは3日間待つだけ。そしたらメールでできたよーって通知が来るので、ダウンロードしてプリントアウトしておしまい。まだプリントアウトは自分はしてないけど。
英語がわからないとGoogle翻訳するとかでもうちょっとかかるかもしれないけど、パスポートとスマホがあればすぐにできちゃいます。あと費用の2,500円くらい。自分はJCBカードで払ったので、カードがあると便利。他にもオプションあったけど覚えていない。
なんか、質問事項の中に「宗教はなに」ってあるのはおもしろかった。そんなの聞くんだって。ベトナムって何教がメジャーなのかわからないし、仏教とか書かないと入国できないのか?とか勘ぐったけど、嘘は行けないと思い、何も信じていないのでNoneと入れて出してみたら、ドキドキしたのがそんなくらいすんなり通りました。いやー、良かったよかったー、神様ありがとうー。
顔写真とパスポートの写真も送る必要があって、パジャマパーカーの自宅自撮り写真と、押さえてる指が入ってるようなパスポートの写真だったけどビザ通ったので、よっぽど変なことを書かなければふつうに書いたら通るんだと思います。

あとは行く先を決めるだけ。ベトナム行くのはいいけど、ベトナムに何があるのかとか何をしたいとかを全然決めていないから、これから決めないと。決めておかないと、きっとホステルの周りをぶらぶらするだけで終わる気がする、この旅・・・w

【Android Studio】エラーがでるとき。Emulator: emulator: ERROR: Unknown AVD name [Pixel_3_API_29], use -list-avds to see valid list.

エラー内容

11:53 Emulator: emulator: ERROR: Unknown AVD name [Pixel_3_API_29_2], use -list-avds to see valid list.11:53 Emulator: emulator: ERROR: Unknown AVD name [Pixel_3_API_29_2], use -list-avds to see valid list.
11:53 Emulator: Process finished with exit code 1

原因

AVD managerがAVDを作った場所とEmulatorが見に行く場所が違っているかららしい。なぜや・・・。

解決方法

これでいいのかわからないけど、とりあえず動かしたいのであれば以下でできました。

  1. /root/.android/avd
  2. /home/USERNAME/.android/avd

AVD managerは1に作るけどEmulatorは2に見に行くからみたいなので

cp -pr /root/.android/avd/* /home/USERNAME/.android/avd
※USERNAMEは自分のユーザー名に置き換えてください。

とすればエラーなく実行できるようになります。

参考

https://stackoverflow.com/questions/48996437/process-finished-with-exit-code-1-unknown-avd-name?noredirect=1&lq=1

【図解】 sedの図解

sedの図解

sedの図解が探してもなかったので自作してみました。やっぱりコマンドが何をやっているかはイメージ図が合ったほうが理解しやすいので。

sedの構成

標準入力標準出力パターンスペースホールドスペースsedスクリプト

これだけわかっていれば理解しやすいです。

  • 標準入力:ここから一行ずつ読み込みます。
  • パターンスペース:ここがメインの作業場所になります。ここに読み込まれた行をいろいろ操作します。
  • ホールドスペース:一時的な記録場所です。
  • 標準出力:パターンスペースで編集した内容を標準出力に出します。
  • sedスクリプトsedはこのスクリプトに従ってデータを編集します。sedスクリプト内をループしたりもできます。

sedの動作の流れ

sedが何をしているかというと、大きく言えば以下のことをしているだけです。

  1. 標準入力から1行読み込んでパターンスペースに入れる
  2. sedスクリプトをすべて実行する
  3. 標準出力に出してパターンスペースを空にする。

 

pip install --upgrade pocketsphinx が失敗するときの対応方法

現象

こんな感じのエラーメッセージが出る。

・・・省略・・・
deps/sphinxbase/src/libsphinxad/ad_alsa.c:76:28: fatal error: alsa/asoundlib.h: そのようなファイルやディレクトリはありません
compilation terminated.
error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
----------------------------------------
ERROR: Command errored out with exit status 1: /home/shohei/tmp/20190810/env/bin/python3.5 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-__0ixsyy/pocketsphinx/setup.py'"'"'; __file__='"'"'/tmp/pip-install-__0ixsyy/pocketsphinx/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-w1j6dzl6/install-record.txt --single-version-externally-managed --compile --install-headers /home/shohei/tmp/20190810/env/include/site/python3.5/pocketsphinx Check the logs for full command output.

原因

インストールに必要な、いろいろなパッケージが入っていないために起こります。

対応方法

エラーとなったファイルがどのパッケージに入っているかを見つけて、エラーが出なくなるまでインストールし続ければ解決です。

# ファイルからパッケージを探すためにapt-fileをインストールします。インストール済みの場合はしなくてよいです。
sudo apt-get install apt-file
sudo apt-file update

# エラーメッセージから存在しないファイルを特定し探します。この例ではpulse/pulseaudio.hです。
sudo apt-file search pulse/pulseaudio.h

# 対象のパッケージをインストールします。
sudo apt-get install libpulse-dev