jj1gujのブログ

アイコン画像は音速の奇行子 様よりいただきました

Chokudai Contest 005参加

お久しぶりです.
9月は研究したり風邪引いたり闇落ちしたり闇堕ちしたりものすごく忙しかったです…
それはそうとChokudaiContest005に参加しました.
NyanyanHonazoの3人でOpenEsysっていうチームを組んで参加したよ.
結果は49,985,585点の141位でした!!

前日

コンテスト開催が発表されたのでSlackで参加者募集してNyanyanをつかまえる.
Chokudai Contest 003を解いてマラソンの復習をする.

当日

Honazoをつかまえる.
Chokudai Contest003で焼きなましのお勉強してめちゃくちゃ点数を上げた.

コンテスト本番

開始直後

Honazoに入力部を, Nyanyanに貪欲解の生成を書いてもらい, ぼくは得点計算を書く.
得点計算書き終わったあたりで入出力チェッカーとテストケースの存在に気づく…
問題文は最後までしっかり読みましょう.
貪欲書き上がったところで提出して17172700点ゲットする

1回目の提出直後

Nyanyanが新しい方針で貪欲実装して49985585点を獲得する.
Nyanyanすごすぎる… †貪欲のプロ† 貪欲解のtourist!!

コンテスト終了まで

いよいよ局所探索のお仕事を始める.
とりあえず初期解のうち適当に場所を選んでそこの色を適当に変え , 変えた次の場所から再度貪欲をとき直していくって方針でやろうとしたけどバグらせたままなぜか初期解から点数を落としておわっちゃった…
かなしいね…

よかったこと

・めちゃくちゃいい点取れた!!すごい!!
・今回VSCodeのlive shareっていう拡張使ったんですけど一斉に編集できてめちゃくちゃ便利だった

反省

・局所探索がうまくいかなかった.
・入出力チェッカーを使いこなすことができなかった.
・ビジュアライザほしかった.

感想

問題見たときからちょっと局所探索難しそうだなぁとは思っていたけど実際難しかった…
貪欲書いてもらっている間に自分で局所探索の実験するとかもうちょっと時間を有効活用すればよかった…
時間があるときに今回の問題使って局所探索を書いてみます

Windows10でメモ帳が使えなくなったときの対処法

メモ帳が使えなくなったので使えるように直したよ

あらましと概要

txtファイルをメモ帳で開けなくなったので調べてみたらなぜかメモ帳がアンインストールされてたので再インストール&スタートメニューに登録するところまでやりました.
なんでアンインストールされたんだろうね…

環境

Windows10 バージョン2004

解決方法

  1. 設定>アプリと機能>オプション機能にアクセスし, インストールされている機能にメモ帳があるか確認する. ある場合は3. に進む.
  2. 機能の追加をクリックし, メモ帳と書いてあるところのチェックボックスをクリックしてインストールして再起動する(再起動はひょっとしたらいらないかも…).
  3. エクスプローラーでCドライブ>Windows>System32にアクセスし, notepad.exeを探し, ショートカットを作成する.
  4. ショートカットの名前をメモ帳に変更し, Cドライブ>ProgramData>Microsoft>Windows>スタート メニュー>プログラム>Windowsアクセサリに移動させる. ProgramDataが見つからない場合, エクスプローラーの表示タブをクリックし, 隠しファイルのチェックボックスにチェックを入れると見つかるはず.

ここまでやると下のようにメモ帳が追加されます.
f:id:jj1guj:20200802163636p:plain

最後に

他にもっといい解決方法あったら教えて下さい…

参考文献

www.atmarkit.co.jp

dekiru.net

IARU HF World Championship参加

7/11, 12に開催されたIARU HF World Championship(IARU HF)に参加したよ.

これは何?

アマチュア無線の国際組織IARU(International Amateur Radio Union)が主催するアマチュア無線のコンテストというか世界大会的ななにか.
他のメジャーなアマチュア無線のコンテストだとコンテスト時間が48時間でモード(電話とかモールスとか)が分けられているのに対しモードがごちゃまぜで時間が24時間と短いのが特徴(かな?)

ルール

ここ見て↓

2020 IARU HF Championship Contest Info

アマチュア無線あんまよくわかんない人のための用語解説

  • CW: モール信号のこと. ノイズに強いので電話よりも遠くに飛ぶしあんまり体力使わないから楽しい
  • 交換ナンバー: コンテスト時に交信が成立したことの証拠として送り合う番号. 今回のコンテストではITUゾーン番号(後述)を送る.
  • マルチプライヤー: 通称マルチ. 得点を出すときにマルチの数だけ掛け算されるのでたくさん取れば取るほどたくさん点が取れる. 今回は交信できたITUゾーンの数+HQ局の数
  • ITUゾーン: こんな感じになんか地球を90地域に分割したやつらしい(ぼくも初めて知った).
  • HQ局: なんか各国のアマチュア無線連盟が主体となってこのコンテストのためだけに運用する特別な無線局. 交信したHQ局の国の数だけマルチになる

参加記的ななにか

今回はシングルオペ(全部1人でやること) CW Low(出力を150W以下にして運用すること)で出場したよ.
18:00くらい #univradio終わって諸々セッティングとかする
19:00くらい 7MHz CWで場所取りを完了させる
21:00 コンテスト開始. 開始早々アメリカから大量に呼ばれてよろこぶ.
21:14 ロシアから呼ばれる. おそロシア…(言いたかっただけ)
21:16 インドネシアから呼ばれる. JavaJavaScriptはインドとインドネシアくらい違う(言いたかっただけ)
22:30 ニュージランドから呼ばれる.
22:48 ハワイから呼ばれる.
23:22 3.5MHz CWに移動. 雷なってたせいかノイズが酷くて早々に萎える.
23:31 フィリピンと交信成功
23:37 オーストラリアと交信成功
24:00~24:30 ABEMAでSAO見る. OPめっちゃ神!好き!久しぶりのシノンでうれしい!
24:30~25:40 3.5MHzと7MHzを行ったりきたりしながら着々と得点を重ねる.
25:40~翌5:00 ひたすら7MHzをやる. この時間帯ヨーロッパがどちゃくそとれるのでやるしかない.
5:00~6:30 松屋に朝ごはんを食べに行く

6:30~7:30 21MHzでアメリカが取れるかいう噂を聞いて21MHz に移動するもののあんまし聞こえなくて萎える.
7:30~12:00 どの周波数もあんま取れなくて泣きながら寝る. ひたすらに寝る.
12:00~15:00 がんばって21MHzをやる.
15:00~16:00 何やってたか記憶がまったくない…
16:00~20:30 7MHzに戻ってひたすらに呼びまくる
18:09 ヴァージン諸島に呼ばれてめっちゃ興奮する. なおぼくはヴァー(検閲済)
18:11 アルゼンチンに呼ばれてめっちゃ興奮する.
18:14 ベリーズに呼ばれて最初どこそれ?ってなったけどめっちゃ興奮する(カリブ海にある国らしい)

www.mofa.go.jp

18時くらいってそういう系のところから呼ばれるので楽しいね
20:30~21:00 そろそろ7MHzで呼ばれなくなったので3.5MHzに移動して得点を荒稼ぎして終わる.
21:03 暫定の得点見て思ったより取ってて大爆笑する

21:15 えらいのでコンテストのログを提出する. みなさん, ログを出すまでがコンテストですよ.
21:36 部内のwikiを書ききる
22:00 百香亭で打ち上げやろうとしたらやってなかったので麺 the Tokyoで1人さみしく打ち上げをやる. 冷やし中華めっちゃうまかった.

22:30 環境音がすべてモールス信号に聞こえる病気にかかる*1

26:55 ぐだぐだTwitterやって寝る.
翌14:50 起床. スマホを見て震える.

感想

1.9MHz

ノイズだらけで誰もいなくて泣いちゃった.

3.5MHz

1日目ノイズだらけで萎えたけどまあいい感じにできてよかった.

7MHz

カリブ海取れてよかったよまじで(アマチュア無線界隈では日本からだとアフリカとカリブ海とは交信するのが難しいことでよく知られている)

21MHz

あんまり飛ばなくて泣いちゃった.
おっきいあんてながほしいです.
だれかかってください.

まとめ

えー, アマチュア無線のコンテストは競プロのコンテスト以上に生活を崩壊させにかかるので注意が必要です()

*1:これCWやってる人あるあるだと思う

Fortranで機械学習をやりたい!!

お久しぶりです.
最近こんなことを思っています…
なんでこんなことを思ってるかって?
急に, 機械学習ってみんなPythonでやってるよなぁ…みんなと違うことしたいよなぁって思っちゃったからです.
思っちゃったものは仕方ないですよね()
ではさっそくいってみましょうか.
ソースコードはこちらにあるので合わせてお読みください.

github.com

目次

目標

なにをするにも目標を立てることが大事です.
なので目標を立てましょう.

方法

目標を立てたら次に作戦, もとい方法を考えましょう.

第1章

Pythonの入門ですね.
一時期AtCoderFortranのLanguage Owners 1位*4だったぼくには再びFortranに入門する必要もないでしょう()
ってことで飛ばします

第2章

パーセプトロンについてはFortranでやってるかたがいらっしゃるようですね.

qiita.com

ここまで難しいのはあれなので本に書いてある簡単な論理ゲートを実装してみましょう.

github.com

そういえばFortranの配列ってNumpyみたいに式かけば要素積取れるんですね.
初めて知りました.
っていうか誰ですか再びFortranに入門する必要もないとか言った人は.

第3章

ここではニュラルネットワークの説明と必要な機能の実装をしていますね.
1年ぶりくらいに読んだんですがめっちゃ勉強になりますね.
まあ研究テーマ機械学習じゃないんですが()*5
ここはまだまだ軽いのでひたすら実装していきます.

github.com

行列積はOpenMPでもりもり並列化かけました.
あと後半のMNISTはなんかFortranで実装するのつらそうだったのでとりあえず飛ばしました.
人生逃げることも大事だよ.
というかFortranの関数定義とかモジュールとかサブルーチンとか初めて触ったわ~
っていうか誰ですか(ry

第4章

ここめっちゃ学習のかなめの部分じゃないですか~
実装が途端に重くなりましたね.
とりあえず損失関数は有り余る才能()で書けて, 勾配計算もさっきなんとかなりました.

github.com

あと勾配降下法とか学習アルゴリズムの実装とかそこら辺ですね.動作確認してないですが今日あらかた完成させました. いうことでいよいよMNISTデータセットと戦います.
辛いですね. (2020年7月4日)

MNISTデータセットの読み込み

こちらは本編ではあまり触れられていませんでした(ただgithubに上がってるこのコード使ってねで終わってた)
Python機械学習用ライブラリではそこらへんもコマンド一つで勝手にやってくれるというぬるさっぷりですが()我らがFortranでは1から実装していきます.
まずはこちらのサイトからMNISTデータセットをダウンロードしてしまいましょう.

yann.lecun.com

このページを下の方にスクロールしていくとデータの格納形式が書いてありますね.
画像データについてはこんな感じらしいです.

[offset] [type]          [value]          [description]
0000     32 bit integer  0x00000803(2051) magic number
0004     32 bit integer  60000            number of images
0008     32 bit integer  28               number of rows
0012     32 bit integer  28               number of columns
0016     unsigned byte   ??               pixel
0017     unsigned byte   ??               pixel
........
xxxx     unsigned byte   ??               pixel

ラベルデータについてはこんな感じらしいです.

[offset] [type]          [value]          [description]
0000     32 bit integer  0x00000801(2049) magic number (MSB first)
0004     32 bit integer  10000            number of items
0008     unsigned byte   ??               label
0009     unsigned byte   ??               label
........
xxxx     unsigned byte   ??               label

(いずれもMNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burgesより抜粋)
とりあえずさっと書いて読んでみたのですがうまく行かないのでとりあえず今日のところは寝てまたやります.

今後の目標

まだ完成してないけど今後の目標を書いておきましょう.

最後に

い か が で し た か ? 笑
なんか進捗報告だけでほぼほぼ解説してないですがちゃんとできたら解説も書きます(ほんまか?)
あとすぐには対応できないかもですけどアドバイスとかあったらいただけると幸いです.

参考文献

斎藤 康毅 著 「ゼロから作るDeep Learning ――Pythonで学ぶディープラーニングの理論と実装」(O'Reilly Japan)
Fortran 入門
Fortran Tip集
Fortran演習 (地球惑星物理学演習) — Fortran演習(地球惑星物理学演習)
MNIST:手書き数字の画像データセット:AI・機械学習のデータセット辞典 - @IT
MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burges

(追記)
2020/7/4 進捗を追加
2020/7/8 MNISTデータセットについて適当に解説を加えた&参考文献を追加

*1:未来屋書店アニメイトが隣同士だったから仕方ないよね

*2:未来屋書店技術書の揃えが悪すぎてさすがに悪すぎて笑ってしまった

*3:レイクタウンは球詠の聖地です. みなさん行きましょう

*4:Fortran(GNU Fortran 9.2.1)での記録

*5:進捗, やばいです

ABC169参加

久しぶりですね.
ところでABC169に参加しました!! コンテスト結果はこちら Fortranで3完, Pythonで2完でした.

A問題

Fortranで提出しました.
やるだけです.

B問題

Pythonで提出しました.
$A$をソートして下からかけていって$10 ^ {18}$を超えたら-1を出力して超えなかったら答えを出力しました.
最初ソートし忘れて1ペナ食らいました.

C問題

Pythonで提出しました.
普通に掛け算すると丸め込みでWAになってしまうので$B$を一旦整数にしてから計算し, 積を100で割った商を出力しました.
$B$を整数にするところでミスが多発して1ペナ食らいました.

D問題

Fortranで提出しました.
$N$を素因数分解してn(n+1)/2=(各素数に対する指数)の整数解を求めて足して出力しました.
整数解出すところでミスしたのとデバッグ用の出力を潰さなかったせいで2ペナ食らいました.

E問題

Fortranで提出しました.
無証明でサンプルから$B$の中央値$-A$の中央値$+1$したら行けそうだと感じたのでそれでやったら通りました.


久しぶりに5完しました!
やったね!!
サンプルエスパー無証明成功すると気持ちいいですね!

次回冷やさないようにがんばります

ABC165参加

ABC165に参加しました!! コンテスト結果はこちら Fortranで2完, Pythonで1完, C++で1完でした.

A問題

Fortranでだしました.
$A$から$B$までループ回して$K$の倍数があったら'OK', なかったら'NG'を出力しました.

B問題

Pythonでだしました.
預金額を$Y$円としたときに$\lfloor Y/100 \rfloor $をループを回して足していって$X$円を超えたところでループを止めました.

C問題

C++でだしました.
最初貪欲でやっていったらサンプル2でWAだったので発狂して先にD解いてました.
Dとき終わったあとに制約とか見返してたら先頭を固定すれば$A$の場合の数は高々$10 ^ 9$だとわかったので*1全探索で行くことにしました.
DFSで考えられる数列を全列挙し, あたえられた条件に当てはまるか全ての条件を試して得点を足していきました.

D問題

紙でsample1を解いていたときになんか周期性を感じたので(は?)頑張って数式化してみました.
$x=Bc+d$ ($0 \le d \le B-1$)とすると,
$\lfloor \frac{Ax}{B} \rfloor = \lfloor \frac{ABc+Ad}{B} \rfloor = Ac+ \lfloor \frac{Ad}{B} \rfloor$
$A \times \lfloor \frac{x}{B} \rfloor = Ac$
よって
$\lfloor \frac{Ax}{B} \rfloor - A \times \lfloor \frac{x}{B} \rfloor = \lfloor \frac{Ad}{B} \rfloor$
ここで$\lfloor \frac{Ad}{B} \rfloor$は単調増加なので, $N < B-1$なら$d$に$N$を代入して, $N \ge B-1$なら$d$に$B-1$を代入して計算し, 出力するようにしました.
今回開始が10分遅れだったのに終了時刻がいつもどおりだと勘違いしてC問題でやみくもに提出しまくって3ペナ生やしてしまいました…
やみくもに提出せず, ペナを生やしていなければパフォが30くらい上がっていたのでもったいなかったです…
ただ最近あまり精進できていなかったのに4完できたのは偉いと思います.
みんなほめてください(は?

*1:本当はそれよりもっと少なくて${} _ {20} \mathrm{C} _ {10}$らしいです

SDRplayをTCP経由でSDRSharpで使えるようにする

昨日SDRplayがお家に届いたので遊んでみたよ!!

きっかけ

SDRplay用の推奨ソフト(?)*1であるSDRunoをインストールして使ってみたけどかなり使いにくいと感じました.*2 そこで, 普段から使い慣れているSDRSharpで使いたいと思って調べてみたら公式マニュアルがあったのでこの通りにセットアップしてみたところ, うまくいかなかったのでTCP経由で使えるようにしました. 調べてみたところここで公式マニュアルの方法だともうできなくなっており(は?), TCP経由であれば機能は制限されるものの使えるよ的なことが書いてありました(圧 倒  的 英 弱なのでひょっとしたら違うかも)

読み進める前に

まず以下の条件をすべて満たしていることを前提とします

  • SDRplayを購入済みである(アイキャスエンタープライズラジオパーツジャパンで買える. 2020年4月当時だとアイキャスの方がセール中かなんかで多分安かった)

  • SDRunoをインストール済みである(してない場合はここからインストールしてください)

  • SDRsharpをインストール済みである(してない場合はここからインストールしてください)

やりかた

  1. ここからTCP SERVERをダウンロードし, zipファイルを解凍する.
  2. 解凍したフォルダを適当なところに移動する.
  3. 移動したフォルダを開いて, rsp_tcp.exeをダブルクリックして実行する.
    f:id:jj1guj:20200426044354j:plain
  4. 下の写真のようなコンソール画面が出てきたらSDRsharpを開いて実行する. f:id:jj1guj:20200426044546j:plain
  5. SDRSharpの画面左にあるSourceのドロップダウンをクリックしてRTL-SDR(TCP)を選択し, 変更する.
    f:id:jj1guj:20200426044656j:plain
  6. 画面上にある▷マークをクリックして再生する.

    やってみた

    ちょうどALL JAコンテストをやっていたので3.5MHz CWを聞いてみました.

    f:id:jj1guj:20200426045342j:plain
    おっ、ええやん
    こんな感じで受信することができ, いい感じに聴くことができました~!!
    や っ た ね!!
    これで気象FAXの受信とかもしてみたいですね…(やったらまた記事書こうかな)

*1:推奨かどうかは知らないけど公式マニュアルだととりあえずこれで説明されてる

*2:使い慣れてないだけ説が濃厚な気もする