JUNのブログ

JUNのブログ

活動記録や技術メモ

Install python3-pip in Ubuntu 18.04

何故か Ubuntu 18.04.2 LTS 上で python3-pip をインストールした際に何故か動かなかった。

Traceback (most recent call last):
  File "/usr/bin/pip", line 9, in <module>
    from pip import main
ImportError: cannot import name main

1時間くらい詰まって、解決したのでここにメモする。

解決法

apt install python3-pip は使わず get-pip.py を使う。

get-pip.pyの取得とインストール
$ wget https://bootstrap.pypa.io/get-pip.py && python3 get-pip.py --user

PATHを通す
$ echo 'export PATH=$PATH:$HOME/.local/bin' >> ~/.zshrc
bashを使ってる人は ~/.bashrc に変更してください。

おまけ

pipenv のインストール
$ pip3 install pipenv

参考にしたリンク

stackoverflow.com

icchy.hatenablog.jp

Ubuntu NTFS形式のドライブからコピーしてきたファイルのターミナル上での表示を直す

昨日Linux MintからUbuntuに乗り換えたのですが、その際にNTFSフォーマットの外付けSSDに必要なデータをコピーし、Ubuntuインストール後それらのファイルをUbuntuにコピーしました。

しかし、ターミナルをいじっているとそれらのNTFSフォーマットのドライブからコピーしてきたファイルだけ表示される色がおかしいことに気づきました。

f:id:JUN_NETWORKS:20190701030048p:plain

ちなみに普通のファイルやディレクトリは正常に表示されます。

f:id:JUN_NETWORKS:20190701025629p:plain

(※ この記事で、"モード"と言っているものは"アクセス権限"とも呼ばれます。モードがわかりにくかったらアクセス権限と置き換えてお読みください。)

原因

NTFS形式は"読み取り可能"と"実行可能"の区別を持っておらず、Linux上のファイルをNTFSフォーマットのところへと持っていくと自動的にモードがパーティションマウント時のオプションのモードになるようで、そのマウント時のモードがデフォルで777だったと考えられます。それによりモードが777になるせいでこのようになったのだと思います。

実際モードを見てみるとNTFSフォーマットのドライブからコピーしてきたファイルやフォルダはすべて同じモード(777)です。

f:id:JUN_NETWORKS:20190701031053p:plain

解決方法

linuxではモードは通常、ディレクトリは755, ファイルは644 に設定されています。

なので、元々あった本来のモードの復活は無理でも、デフォルトのモードにすることでほとんどのディレクトリやファイルは問題ないと思います。

以下のコマンドを叩くことで /path/to/base/dir 以下 の全ディレクトのモードを755にします。

find /path/to/base/dir -type d -exec chmod 755 {} +

ファイルは644にします。

find /path/to/base/dir -type f -exec chmod 644 {} +

superuser.com

これで以下のように正しくモードが変更されました。

f:id:JUN_NETWORKS:20190701033629p:plain

最後に

こんなことになるならLinux MintからUbuntuに以降する作業の前にext4にフォーマットしておくんだった...

マウントオプションで permissions という値を追加するとNTFSでフォーマットでモードを保持できるようになります。

f:id:JUN_NETWORKS:20190701042617p:plain

値を追加したあとは、一度アンマウントしてもう一度マウントするとchmodでの権限の変更と変更後の権限の維持ができるようになっていると思います。

追記 (2019/10/30)

モードも勿論変更しなくてはいけないが, それと同時に所有者とグループを変更しないといけない

chown -R user:group /path/to/base/dir

superuser.com

暁寮寮食BOTのメニュー登録を自動化した。

1年くらい前に作った寮食BOTのメニュー登録を自動化しました。

寮食BOT作った時の記事 ↓

jun-networks.hatenablog.com


自動化した理由

なぜか 2019年6月分のメニューデータの登録が何回やっても上手くいかず、サーバー内のデータを見たところ、画像のメニュー分割が上手くいっていないようでした。
何回もメニューの写真を撮って、サーバーにアップロードし、確認、っていうのが面倒だったのでなんとか自動化しようと思って土曜日の2時間くらい使って自動化しました。

まぁ正直記事にするほどのことでもないんですが、こういう機会でも無いと普段記事書かないので書きます。

自動化する前のメニュー登録の流れ

まずは今までのメニューデータの登録の流れとしては

  1. 今月の寮食メニューのプリントが寮のロビーに月始めに張り出されるので、それをスマホで撮る
  2. その撮った写真をサイト上の寮食BOTのサイト上にある登録フォームに送信
  3. 送信が終わったら、メニューが正常に登録されているかサイトのトップページで確認

詳しい、サーバー内のロジックについては寮食BOTを作った時の記事に書いてるのでそっちを見てください。

自動化するにあたって

寮食のメニューというのは実は寮の公式サイト上にPDFとして公開されています。 2019年6月分メニューデータPDF
最初はこのPDFのデータを抽出して登録しようと思ったのですが、なぜかPDF内のテキスト情報を抽出しようとしても1文字も抽出されません。なぜだ...

なんとこのPDF、拡大してみると

f:id:JUN_NETWORKS:20190609230031p:plain

文字がかすれてる...?

おそらく、このPDFは印刷したメニュー表をスキャンしてPDF出力したものだと思います。

えぇ...(困惑)

仕方ないので、メニューの自動取得の方法を変更します。

旧: PDFのデータから文字を抜き出してメニューを登録する

新: PDFを画像データに変換してそれを今まで使っていた寮食BOTのformで自動でPOSTリクエストを投げる。

ってことでメニュー登録を自動化する方向が完全に決まりました。

で、必要な処理としては以下の通りです。

  • 寮の公式HPから寮食のPDFへのリンクの aタグ を抽出し、それの href 要素を取り出し、その href に入っているURLのリンク先のPDFをダウンロードする。
  • ダウンロードしたPDFファイルを画像ファイルに変換する。
  • 画像ファイルに変換したPDFを寮食BOTサイトのメニュー登録formにリクエストを送る。
  • また、PDFが更新されてるかどうかは、 href 要素が前回の確認から変更があったかで判定する

これらの処理を1つのスクリプトにまとめて、cronで定期実行します。

で、このスクリプトを cron で1日1回定期実行します。

sudo vim /etc/cron.d/akatsuki

* * */1 * * python3 /home/jun/Akatsuki/update_menu.py

と書き込み、これで cron で1日おきにスクリプトの実行をするようになります。

参考にしたリンク

[PyTorch] RuntimeError: CUDA error: the launch timed out and was terminated

今日訓練開始から50時間くらい経過した時にこんなエラーが出ました。

raceback (most recent call last):
  File ".\train.py", line 382, in <module>
    main(args)
  File ".\train.py", line 346, in main
    opt_cn.step()
  File "C:\ProgramData\Anaconda3\lib\site-packages\torch\optim\adadelta.py", line 76, in step
    acc_delta.mul_(rho).addcmul_(1 - rho, delta, delta)
RuntimeError: CUDA error: the launch timed out and was terminated

初めて見たエラーだし、情報もそんなに無いしでどうしようかと思ったんですけど、解決したので違う誰かが同じように困ったら見れるように、ここに書いときます。

環境

原因

画面描画のためのGPUドライバの応答が無くなったとOSが判断した際に、GPUドライバを強制的に再起動するために起こります。

OpenCL1.1 泥沼メモ 【解決編】 より

だそうです。

直し方

Windowsレジストリタイムアウト時間が設定できるようです。

  1. HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/GraphicsDrivers
  2. HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/GraphicsDrivers/DCI

の2箇所のディレクトリ内に DWORD値 の項目を追加します。

  • TdrLevel
    • 「0」:検出無効・・・タイムアウトしない
    • 「1」:回復なしでバグチェック
    • 「2」:VGA への回復(?) 「3」:タイムアウト時に回復する(既定)

私はこの TdrLevel の項目を 0 に設定したら起こらなくなりました。 もし、心配なら、必要な時以外は規定の 3 にしておけばいいと思います。

参考サイト

18歳になりました。

2019/2/3に18歳になりました。最近ブログをほとんど書いてないのでこの機会に書きたいと思います。

18歳というといろいろ解禁される歳ですね。確か選挙も行けるんでしたっけ?

それはともかく、去年の振り返りを書けていなかったので、このタイミングで箇条書きですが、17歳の振り返りでもしてみます。

2018

February

  • 17歳になった。
  • Mashup Summit 福井 にスピーカーとして参加した。
  • 彼女と別れた
  • 暁寮寮食BOTを作った

March

  • 中京テレビハッカソン(アイデアソン)に出た。
  • 知り合いに頼まれて業務用プログラムを作った。結構な金額をもらった。
  • Kosen16sの人達と遠足(?)で姫路らへん行った。
  • 機械学習の勉強を初めた。(numpyレベルから)
  • Kaggleに登録した(なおこの後10ヶ月ほど放置)

April

  • 無事に進級できた
  • シュタゲにハマってた
  • TalkingDataコンペに参加してみたが、データ量の多さに圧倒されリタイア。 今考えたら、ダウンサンプリングしたら良かったのですが、当時はそんなテクニック知らなかった。

May

  • メインPCのOSをLinuxMintに変えた。
  • 試験勉強ガチってたのでコード書いてない

June

  • プロコン競技部門のプロジェクトにジョインした。
  • 特になにもしてない気がする。

July

  • Google Home 買った。
  • 試験勉強してた
  • 多分プロコンのコード書いてたはず...

August

  • AtWareさんのところでインターンに参加させて頂いた。Reactとかやった。
  • HackUで優秀賞を取った。

jun-networks.hatenablog.com

September

  • ReactNativeすこし触った
  • 多分プロコン関係してた気がする。

October

  • プロコン競技部門開発頑張った。
  • 学祭があった。
  • 結局うちの競技部門はプログラムの開発が間に合わず、人力部門になりました。

November

  • 後期中間試験
  • MashupAwardsの学生部門の決勝で東京行った。
  • 機械学習の勉強再開した

December

  • MashupAwardsで"ふくい産業支援センター賞"をもらった。
  • 機械学習の勉強してた。
  • だらだらしてた。

2019

January

  • Quoraコンペに参加した。

感想

全体的に堕落気味だったかなと思います。もっと有効的に時間を使えただろうし、もっと効率よく勉強したらもっといろいろできたんじゃないかなと思います。

ただ、私は集中力がある方ではないので、やろうと思ってもなかなか難しいところがあったり...

また、去年の後半からですが英語の勉強を毎日するようにしました。これはとてもいいことだと思います。そのおかげかはわかりませんが、英語の講義も字幕ありなら普通に見れるようになりました。

体に関しては、運動不足で筋力が落ちまくってるので、来年度はもう少し運動なり筋トレなりしようかな。

プログラミング方面としては、機械学習の勉強を始めたというのが大きいですね。ただ、始めた当時まだ微分を習ってないのもあって、スタート地点がだいぶ後ろからなのでずいぶんと進むのに苦労し、遅くなってしまいました。でも最近はある程度わかってきたような気もするのでこの調子で頑張っていきたいですね。

機械学習以外に関してだと、Djangoをもうちょい触りたかったかったです。結局寮食BOTのバックエンドサーバーで使ってから触ってないので。個人的にはDjangoは結構好きなので来年は最近勉強している機械学習関連とも組み合わせて使えたらいいなぁ。

あと、インターンでJSを少し触りました。JSはチュートリアル程度ならやったことあったので、なんとかなるかなぁって思ってたらなんとかなりませんでした。ES6の文法はわからないし、Reactはめっちゃ難しいし、CSSは言うこと聞かないし、フロントエンドって大変ですね。

あと、現在KaggleのQuoraコンペに出ているのですが、私はKaggleに人間性を捧げれるほど強くない(捧げたら多分留年する)ので、なかなかきついです。多分メダル獲得は無理ですが、参加して足掻いてるだけでも多くの学びを得られたので、今のところはこれでいいかなという感じです。来年はメダル取れるといいなぁ...

あとは、特に何かの分野に限った話じゃないんですが、ブログの記事数を見てわかる通り去年度後半はアウトプットがとても少なかったように思います。来年度はもっとアウトプットを増やしていきたいです。

また、いくつかのイベントの感想をピックアップするなら、まずは初参加のプロコンですかね

初プロコンは競技部門だった訳ですが、完全にワンマン開発で99%のコードを僕が書いてました。体調も数回崩しました。それで結局プログラムは完成せず、なんだかなぁって感じで終わりました。

来年度プロコン出るかはわかりませんが、次出るならワンマン開発はしたくないです。

jun-networks.hatenablog.com

それと、AtWareさんのインターンに参加させてもらいました。初インターンです。

これに関しては、ブログ記事を書いてないわけですが、これには理由があって、業務に関係のあることをいくつかやったので、書いて良いラインがわからなかったのです。

それはともかく、感想としては"とても良かった"です。初めての本格的なチーム開発や、業務としてコードを書くという体験、ユーザーの考えや収益モデルを考える...などなど、普段では絶対に体験できないような業務に近い形の本格的な開発を体験させてもらいました。ありがとうございました。

来年の目標

  • 進級する
  • 英語の勉強を続ける
  • 大学編入のための勉強を始める。
  • Djangoをもっと触る
  • フロントエンドもできるようになる
  • 競プロをする
  • 機械学習の勉強をする
  • アウトプットを増やす
  • (Kaggleをする)
  • (運動をする)
  • (日本語力をもう少しつける。)

今年も一年頑張るぞい!!

P.S. 何か買ってくれると私がとても喜びます 欲しいものリスト

#Procon29に参加した。

注意!!
この記事に有益な内容は含まれておりません。プログラムに対する知見などは得られません。

みなさんこんばんは。今回は10/27~28に徳島で行われた 全国高等専門学校プログラミングコンテスト (通称:プロコン)の競技部門(人力部門) に参加してきたのでそれについて書きたいと思います。ちなみにプロコンは初出場です。

正直最初はあまりにひどかったので書く気はなかったのですが、他高専の人たちが書いてるのを見て書きたくなったので書きます。

最初の注意書きにも書いていますが、この記事に有益な内容はほとんどありません。

5月

プロコンの競技部門の概要を見ていました。
ルールを見た感じなんかAlphaZeroの手法使えばいけるくね? と思って教官に「少し競技部門興味あります」って言ったら競技部門プロジェクトリーダーになっていました。

しかし、うちの学校では競技部門は人気がなく人が集まりませんでした。仕方ないので機械科3年の友達(以下M3と呼ぶ) を誘い無理やり入れました。あとは、解体されたプロジェクトから情報科2年の子(以下I2と呼ぶ) が来ました。これでメンバーが3人集まりました。

6,7月

プロコンのルールに従ったゲームのプログラムを作りました。 この時点で情報科の子はミーティングなどにだんだん顔を出さなくなってきました。(やばいね)

7月らへんに AlphaZero の手法である MCTS+NN について調べはじめました。

8,9月

8月

何もしていません。
そして開発者は基本僕1人なので本当になにも進んでいません。

私はインターンとかセキュリティキャンプとかHackUとかいろいろしてました。

9月下旬

そして、後期が始まりました。ここで衝撃の事実が発覚します。

I2が起業するために休学してました。

まぁ正直彼はコード1行どころか1文字も書いていなかったので正直問題ありませんでした。しかし、本当の問題は 人数が足りない ということです。
もともとうちのチームは3人しかいなく、競技部門のルール上チームは最低3人必要でした。なのでこのままでは本番に出られません。

どうしたもんか...と悩みました。

10月

ここで1年生の情報科の子が入ってくれました。これで一応大会には出れます。

プロコン1ヶ月前になりました。やっと私はコードを書くのを再開しました。

とりあえず時間が無いのでそのへんからMCTSとNNのコードをコピペして、それをゲームに合わせて書き直したりしてました。

ですが、そのままではうまくいきませんでした。
いくつかの原因を考えました。

  • 複数エージェントゲームである。
  • 不完全情報ゲームである。つまり、自分の行動が確実に盤面に反映されるとは限らない。
  • simultaneous game である。(日本語でなんて言うか知らない)
  • フィールドのサイズがランダム
  • フィールドのマスのスコアがランダム
  • ターン数がランダム

つまり、ランダム要素が多すぎるということが原因だと考えました。

そこで、私はいくつかの対策を行いました

複数エージェントゲームである。

1つのエージェントを扱うように2つのエージェントを操作できるようにした。
具体的には、(Agent1行動, (行動方向), Agent2行動, (行動方向)) を1つの行動としました。ただ、こうすると行動可能数が (8方向*2行動パターン)2 = 256 になり、流石に多い気がします。
なので、さらにここから価値の無い行動のゲームノードを作らないようにしました(正確にはUCB1の値に0を掛けた)。

不完全情報ゲーム & simultaneous game である。

ゲーム木を工夫して盤面を相互ターン制ゲームlikeな感じに表現しました。
要は、自プレイヤーが行動した次のノードは敵プレイヤーのターンというふうにしました。与えられる盤面は両者同じです。両者が意思表示が終わり盤面に反映されればその次のノードからはその盤面が入力として与えられるようにしました。

フィールドサイズがランダム

これはつまり、フィールドのinputのサイズが違うと学習できないだけの話なので、最大フィールドサイズである12*12のサイズの配列にフィールドを当てはめるようにしました。これにフィールドの範囲 内が1になっているチャンネルを加えました。

フィールドのマスのスコア&各マスのスコアがランダム

これに関してはよくある特徴量作り的な感じでそのスコアやターン数でカテゴリ番号を付けたりしました。 ただ、これに関しては失敗だったと思います。なぜなら、本番時フィールドのスコアにばらつきはほとんどなくスコアが1~5のマスがほとんどでした。

これらのことを私一人ですべて行っていました。もちろん昼間は学校があるのでコードは書けないので夜~朝に書いていました。 何回か過労で倒れました。あと授業はほとんど寝てました。

10月下旬(プロコン5日前)

多分間に合わないなと確信したのでソルバー開発を捨てました。(人力への完全移行)

一応なにもプログラムが無いというのはまずいと思い、申し訳程度のGUIアプリケーションの開発を始めました。一応ベースはM3が作ってくれていたので私はそこに各種ゲームロジックの組み込みとゲーム操作パネルの設置とスコア表示部分などもろもろを付けました。

10月26日 (プロコン前日)

この日は公欠で学校は休みで朝から徳島に移動しました。

徳島についたらホテルに向かいました。ホテルは東横インでした。東横インは初めてでしたが、とても快適に過ごせたのでこれから観光するときは利用しようかなと思いました。

夜はTwitterで普段絡んでる人達とラーメンを食べたりラウンドワン音ゲーをしたりしました。
めっっっっちゃ楽しかったです。

なおこの時点でGUIプログラムは完成していません。

なので、深夜5時くらいまで起きてコードを書いていました。

プロコン1日目

ここで本番前にやっと指示の出し方を決めました。あと指示塔は3人の中で一番賢いM3くんにやってもらいました(ありがとね)。
指示の出し方は指示塔から見て正面が1でそこから時計回りに1~8としました。そしてトランプが縦なら移動、横ならタイル除去という風にしました。エージェントの区別は黒と赤で分けました。

そして、予行練習前にGUIのやつが完成しました(偉いね)。 しかし、予行練習でデバッグ用のコードになっていてQRコード読み込み部分がコメントアウトされていて結局使いませんでした。

本番3試合しました。結果としては2勝1敗でした。しかし、私達は人力なので負けても正直何も思わないどころかむしろプログラムを使ってちゃんとプロコンしているところに勝ってほしいとみんな思っていました。

GUIプログラムについては途中でバグが発覚したため最初の2試合は使いませんでした。
3試合目、初めてGUIプログラムを使いましたが1ターンあたりの時間が短く入力が間に合わないので結局はじめの3ターンしか使っていませんでした。

Twitterのタイムラインを見ていると人力に切り替えているチームが多数見られたので「プログラミングコンテストとは...」と思いました。

この日は帰ってすぐ寝ました。

プロコン2日目

この日は敗者復活戦がありました...が、ぐだぐだでした。
運営が途中でトラブルを起こしタイムスケジュールが40分がずれて決勝戦も含めすべてのゲームのターン数が40ターンになったり、敗者復活戦4戦目のフィールドがルールの規定から外れていて再試合などなど...

私達のチームの結果は敗退でした。そうですか。って感じですね。(モチベ0)

残りの時間は他の高専生と喋って連絡先交換(Twitter)したり、裏プロコンを観戦したり、プロコンに来ていた知り合いのエンジニア数人と久しぶりに会って盛り上がったりと楽しかったです。

自由・課題・各種ブース

自由、課題共に面白い作品が多かったです。個人的にはフィリピンの大学が作った時間割制作システムが好きでした。

ブースについては TwitterでPFNがブースを出しているということなのでそこに行ってきました。 PFNブースにはかの有名な秋葉さんがいて、私が疑問に思っていること、最近の機械学習の流行りや各種技術の現状、技術や進路に対するアドバイスをもらえました。正直これだけでプロコンに参加して良かったって思うレベルで良かったです。

感想

とにかく、ソルバーを3ヶ月かけて作ったのに1ターンの時間の制約のせいで人力にせざるえなかったチームがいくつか見られたので本当に可哀想でした。来年はなんとかしてほしいものです。

私自身今回のプロコンに関しては当日や前日は楽しかったです。 正直それ以前はしんどすぎて楽しいのかどうかわかりません。今の気持ちはやっと解放されたという気持ちが大きいです。

正直に言うと今回のプロコンはトラウマレベルできつかったです。来年に関しては出るかどうかはわかりません。
面白いアイデアなどがあれば参加したいとは思っていますが、どうも私は鳥羽商船高専情報科のあの陽キャなノリについていけない気がするのでメンバーにもよるかもしれません。
ただ、最近プロコンに他にやりたいことを我慢して3ヶ月を費やすほどの価値があるのかわからなくなってきたのでどうなるかはわかりません。

あと、うちの学校で技術系の話で盛り上がれる人がほとんどいないのでプロコン前日のオフ会で技術関係の話で盛り上がったのは本当に楽しかったです。また一緒に遊んだり喋ったりしたいです。

あと、うちの競技部門担当教官にはとても感謝しています。様々なサポートをしてくれましたし、「ソルバーは多分完成しません」って言った時に責められなかったのは助かりました。あとはいろいろ教えてくれたり、プログラムを手伝ってくれたり今回のプロコンにおいて最も感謝している人物です。

とりあえず、プロコン関係者、阿南高専の学生、プロコン参加学生の方含めすべての関係者のみなさんお疲れ様でした。
来年は出るかはわかりませんが、もし出ることになったら来年は都城でお会いしましょう!

HackU2018大阪 で優秀賞を取った

タイトルのように HackU 2018 大阪大会 にて優秀賞を頂いたのでそれについての記事です。

ちなみに去年のHackUでも同じように優秀賞を取っており、2年連続優秀賞です。

今年こそ最優秀賞を取りたかった...!!

↓去年のHackU↓

jun-networks.hatenablog.com

作ったもの

youtu.be

簡単に説明すると、
写真のスコアリング+写真加工をしてくれるLINEBOT
です。

詳しい内容はYouTubeの方を見てもらえばわかると思います。

感想

今年も優秀賞取れて良かったです。という感じでしょうか。

プレゼンテーション見てもらえばわかるんですが、実は今回なぜか本番時にLINEBOTからの返信が予定していたより遅かったので、画像が返ってきたのが残り0秒のときで、正直すごく焦りました。
けど、最後はちゃんと表示できたのでとても安心しました。思わず声が出てしまいましたw

開発秘話てきなものとしては、今私はインターンシップに行ってて、相方も相方で忙しくて、それもあり開発を本格的に始めたのは2日前だったりします。
2日で開発し、そして私が横浜から夜行バスで大阪帰ってきてすぐにスライド制作を初めて、できたのが発表開始20分前くらいでした。
こんな状態でしたが、プレゼンテーションは結構いい感じに喋れたんじゃないかなぁと思います。

あとは、自分の展示に忙しくて他のチームの作品をほとんど見れてないのでもっとちゃんと見たかったですね。(毎年言ってる)

HackUは私がプログラミングを始めた年から毎年参加していて今年で3回目の参加でした。
基本的に何かを考えてそれを実際に作るというのが好きなので来年も出たいと思います。

来年こそ最優秀賞取りたい...!