ラベル プログラミング の投稿を表示しています。 すべての投稿を表示
ラベル プログラミング の投稿を表示しています。 すべての投稿を表示

書くより読む方が難しいってこと

 どこかで書いたかもしれないけど、やはりプログラムというものは書くよりも読む方が難しいと思う。ここに難しいところがあって、というのも、読まないことにはどうやって書いたらいいかわからないのだけども、読むのは書くよりも難しいのである。だから、どこかのタイミングでものすごく頑張る必要があって、僕はその壁を数年かけても突破できていないな、と常々反省しつつも何とかしようとしている。当然ここでいう書くというのは、基礎文法の練習とかそういうレベルの話をしているわけではなくて、もっと高いレベル、OSSのコミットするつもりで書いたり、売り物にするために書いたりするレベルのはなしである。そのレベルに達するためには、やはりそのくらいのコードを納得感をもってスラスラと読めるくらいでなくてはならないだろうと思う。Code Reading(Dimids Spinellis, 2016)をみると、優れた作品を読まずに素晴らしい小説をかける小説家がいるか、という話が載っていてそれにひどく納得してしまった。
 とはいえ状況を改善するための努力はしようと思っていて、というのも、ここのところ毎朝githubからソースを落としてきてそれを読んでいる。まずは有名どころで普段使っているものから読もうと思って、gnu coreutilsを読み始めた。cat、echo、ls、と有名どころのコマンドの中身を調べている。色々な人の目が通っているので単純にコードとして優れているというだけでなく、Linuxのマクロやシステムコールを色々と使っているというところも勉強になるポイントである。自分のレベルではソースだけで読解するのは厳しいので、参考サイト、特にMizure's BlogのDecoded : GNU coreutilsを見て変数や関数の意味を確認したりしている。有名どころを読み終わったら、utility以外のもっとアプリケーション寄りなものにも手を出して、徐々にレパートリーを広げていきたい。もう少しで初めて1ヶ月になるが、かなりの学習量がこれによって得られるような気がしている。ただし、実力はまだ上がっていない。今後に期待。

Study with meの次

 コロナ渦の真っ最中の頃はよく"study with me"というのをタイトルに含んだ動画よく投稿されていて、実際僕もそういう動画をよく見ていた。ほとんどは自分が勉強している様子をカメラで長尺で撮影して、そこにlofiとかjazzとかのBGMを付与した動画である。画面の端に置いてチラチラと見ながら一緒に勉強するというのが基本的な使い方だ。
 自分が元気で、余裕を持って長時間集中できるという時は何も見ないのがベストなのだが、いつもいつも元気というわけにはいかない。日常で色々あって集中できない時とか、単純に体力が落ちてて集中できない時とかもあるわけで、そういうときにこういう動画群はとても役に立つ。画面の中の人(lofi girlとかの場合はキャラクタだが)が熱心に勉強しているのを見ていると、とりあえず自分も何かしら始めようという気になってくる。
 そして、最近とてもよいコンテンツを見つけてしまい、それが"code with me"である。study with meは確かに良かったのだが、その多くはipadとか参考書を使って勉強している動画であり、パソコン作業をやっている自分とはどうしてもギャップが出てきてしまう。最近は書き物とかプログラミングとか、セキュリティ関連のあれこやこれやをやっていることが多くてもっぱらパソコン作業(そしてどちらかというとアウトプット作業)なので、パソコン作業をやっている動画のほうが良い。自分とやっていることが近いし、いわゆるパソコン作業で悩んでいる人の、途中で手が止まっている人のあの感じが再現(?)されていてとても共感できる。共感できれば一緒に作業しているグルーブ感が出てきて、それによってノリでダラダラと数時間勉強できたりする。数時間集中できればかなり良いのではないか。
 具体的なチャンネル名を出すと、まさしく名が体を表している "Code with me"とかがおすすめかな。他にも色々とコンセプトを持ったチャンネルがありそうなので、探して活用していきたい。

バイナリ解析の学習を再開

 クラスメートがバイナリ解析の勉強を始めたので、便乗して僕もバイナリ解析の勉強を始めることにした。この分野に自分は何度も挫折している。そろそろ克服したい。一応説明を書いておくと、バイナリ解析とはマシン語によって構成されるバイナリファイルを解析して、その内容を動作を理解したり、動作の変更を試みたりするための解析技術のことである。
 挫折の理由は色々あるが、大きくは2つで、1つはこの分野が少なくとも僕にとっては難解であるということ、2つには、周りに学習内容とその感想を共有できる相手がいないからである。

歩行アニメーションの実装について

 おおよそ日報のようなもの。昨日はゲームのプログラムを書いたり、読書をしたり、研究分野の調べ学習をしたりしていた。

 ゲームのプログラムの中に歩行アニメーションを描画するためのコードがある。画像が多いのでコード自体は長くなっているが、構造自体はなかなか単純に作れたと思うのでこれについて書いてみる。

Twitchで勉強

 おおよそ日報のようなもの。昨日は何の気なしにtwitchのプログラミング配信を覗いてみたりしたのだが、これがなかなか良かった。普段はブログや本、ニュースサイトなどでツールやコーディングテクニック等の情報を得ていて、これらもまとまった情報を得るという点では優れているのだが、実際の使用イメージが掴みにくい点が難点である。その点、リアルタイムの配信は実際にツールを使っている様子を見ることできるので、有用性が直感的に理解できて良い。ツールを使ってうまく目的が達成できていれば、それは有用ということだし、終始戸惑っている様子が見れれば、それはあまり良いワークフローではないということだ。また、配信をしているのが優れたプログラマーである場合は、コードベース上での身のこなしもなかなか参考になる。ヘルパーメソッドを定義するタイミング、必要な情報にどのように辿り着いているか、これらは文章での説明ではなかなか理解できる物ではないので、こういったものを見て勉強するのは割と良い手かもしれない。あとは、他人がコードを書いている様子を普段はあまり見ないので、単純にコンテンツとして面白いというのはある。

高級な漬物石

 高級な漬物石を購入したので色々と遊んでいる。パフォーマンスは噂の通りで、普段使いのツールをあれこれまとめて動かしても全然もたつかない。想定外の効能としては、macOSのウィンドウマネジメントが意外に優秀だったことがある。左側に最小したウィンドウがプレビューされていて、これを触ることで今開いているウィンドウ群とまとめて取っ替えることできる。これは実質的に仮想デスクトップを常時利用しているみたいな感じで、これのおかげで1画面でも十分に作業ができるようになった。あとは文字入力のIMEが小気味よい感じ。

 ただし、今後macに完全移行できるかというと、実はそうでもない。キーバインドになれないとか、操作面の違いが大きいとかそういうのはどうにでもなるのだが、一つ致命的なのはVirtualBoxが動かない点である。Oracleも一応Apple Silicon向けのVirtualBoxを公開してはいるのだが、まだまだベータ版ということもあって、お世辞にも使えたような品質ではなかった。研究のためにVirtualBoxが快適に動く環境は必須なので、結局これについては以前から使っているデスクトップを使い続ける他ない(操作画面はリモートデスクトップでmacOSに飛ばす形)。

 開発ツールについてはまだ何を使っていくか決まっていない。Linuxで動いていた開発ツールがある程度は動くので、愛着のあったものは設定を少し変えて使い続ける形で、そのほかのものは少しずつmacで主流のものに変えていく方針。徐々に慣れていこうと思う。

 まぁこれに慣れてしまえば、単にパワフルな環境で開発できるというだけでなく、スーツケースで移動できるワークステーションが構築できるということで、魅力的ではある。今までは実家とアパートで別のPCを置いてあって、それぞれセットアップがあったりして面倒だったが、以降はそれからも解放されるな。

社会的な時差ボケと敵AI

 おおよそ日報のようなもの。12時間位寝てみて、起きたら頭痛がひどい。水分不足かなと思って水を飲んでみたけど治らない。カフェイン不足も疑わしいのでコーヒーを飲んでみたがやはり治らない。となるとこれは寝すぎたせいで起こった時差ボケみたいなものか。そういやコロナ渦のリモートワーク推進の弊害として家にずっといることで起こる時差ボケ的現象が社会問題にもなったらしい。社会的な時差ボケということでsocial jet lag というらしい。春休み始まったばかりだというのにこんなんじゃだめだな、きちんと生活リズムを矯正していこう。
 って、少し前もこんなこと言ってたのに、また同じこと言ってるじゃないか。うーん、やはり人間一人の自制心だけでは限界があるのか。メンターをつけたほうがいいかしら。

ニュースチェック
 Twitter APIの有料化がここ2ヶ月位ずっとニュースになっている。Twitter連携の方は今後もサポートするということだが、ずっといろんなソフトで利用されていたAPIがいきなり有料化した今、Twitter社の言っていることをどれくらい信用できるのか、っていうのが皆が思っていることだと思う。とはいえ、いきなりは変更できないし、仮に変更するとしてもどこに変更するのか。 

ペンタブとストーカー気質

  おおよそ日報のようなもの。昨日は一日中バタバタとしていた。ただし、睡眠不足で午後は意識があまりはっきりしていなかったから、やはり睡眠時間を削って頑張るみたいなことはやめたほうが良い。3時間かかって、普段の30分くらいの生産効率。

 夜はT Classの面々で話をしていて、その間に日をまたいだ。主旨としては、ブログメンバーの なすし が液晶ペンタブレットを購入したので使用感がどんなものかライブでレビューする、みたいなもの。見た感じ使いやすそうだったし、イラスト以外にもいろいろ使用シーンが考えられそうだという印象を受けた。またレビューを書くと言っていたので、近いうちに液晶タブのレビューがこのブログに上がるだろうと思う。

 レビュー会が終わって、プログラミングの宿題をこなした。課題の説明文を読んでもプログラム自体の動作と目的がよく理解できなかったので、結局課題プログラムをmain()から読んで動作を理解した。3時間位かかってようやく課題が完了。達成感がすごい。某数学の人が数学をやるには問題を追いかけ続けるある種のストーカー気質が必要だ、というようなことを言っていた。これはプログラミングやデバッグ、ログ解析についてもそうだろうと思う。各ステップの処理はそこまで難しいものではないのだが、ステップ数の膨大さによって全体の動きが分かりづらい。ここでステップの膨大さに負けず、下手な省エネ化も図らず、ただひたすらに必要な部分を頭っから追いかけて執拗に解析する。これが結局は動作を理解する王道ルートなのである。

 午前中はゼミ資料を読んだりしていたが、眠すぎてほとんど頭に入ってこなかった。ルーティングに関する部分で、RIPでループが発生しないようにするための工夫がいろいろと書いてある。個々の技術のアイデアはそこまで難しいものではないが、結局はこれを使い分けたり併用したりするので、説明も入り組んでいてわかりにくいものとなっている。

 午後はゼミに出席したり、講義に出たりして、結局帰ってきたのは18時過ぎくらいだった。帰宅後は即座に就寝した。

画面更新とゲーム制作会議

 おおよそ日報のようなもの。昨日は15時に起床した。日報を書いてニュースチェックをすることが今年に入ってから続けていたルーティンであったが、それが初めて途切れた。反省します。まずは生活リズムを戻せよ、という話になるかもしれないが、僕の場合は生活リズムが整ったからと言って必ずしも生産性が上がるわけではないので、実はそこまで生活リズム矯正のプライオリティは高くなかったりする。大切なことをは毎日継続すると決めたことを毎日やるということで、反省して今日からまた日報を書いている次第である。

 昨日はミュージックプレイヤーの画面更新の調整と、ReadMeに書く内容を検討したりしていた。画面更新についてだが、Threadから定期的な画面更新をかけようと考えて、そういうコードを書いたのだがうまく動かない。print()を使った出力はできるのだが、py_cuiのコマンドを使っての更新ができない。thread実行後の最初のボタン入力で更新がかかったりする。おそらくpy_cuiの実装に絡む問題だと思うが、仮にそうだとすると、プログレスバーの実装とかはほぼ不可能という話になるから面倒である。これまでpy_cuiにはだいぶお世話になってきているが、やっぱりイベントループを取れないあたりがすごいストレス。tkinterしかり、py_cuiしかり、イベントループ周りを簡素化したものはちょっと手を入れようと思うとその瞬間面倒になるという印象を、今のところ持っている。

 夜にはTClassのゲーム制作会議に出席したりした。ゲーム制作会議は毎回ダラダラと長時間やっているが、ほとんどゲームの話はしていなくて、構成員が興味を持っているトピックを延々語り合うことがその主旨となりつつある。現実の身の回りの人とは趣向が合わなくて話ができない、とか言うメンバーもいるようだから、そういうのを発散する場としても機能している感がある。

3分間ネットワーキングとスレッド

  おおよそ日報のようなもの。昨日は昼すぎるくらいまでエンジンがかからなくて布団の上でボーッと天井を眺めていた。睡眠も10時間くらい取れたし、休日の過ごし方としてはむしろ良い過ごし方ができたのではないか、とも思う。

 午後は先日紹介した「難読化シェル芸の世界」を読み進め、なんとか読了した。この本での難読化の対象はBashであるが、難読化の方針自体は別の言語に移しても適用可能だと思うので、いろいろ試してみたい。 

 技術書絡みでもう一つ話をすると、この3分間ネットワーキングシリーズを大人買いした。3分間ネットワーキングはネットワーク技術を解説しているWebサイトで、わりと長い歴史がある。休憩がてらに覗いてみたところ、文章が面白く、かつ知らないことも書いてあったりしたので本を買ってみることにした。著者いわく、本の文章は本用できちんと書き直したとのことだ。

難読化とthreading.Thread

 おおよそ日報のようなもの。昨日は少しやる気を取り戻して作業に取り組めた。手が止まった状態が続くと楽しさは半減し、苦手意識ばかりが動いてしまうから、とにかく集中して状況を打開する手を考えなければならない。それがプログラミングだったり勉強だったといった知的作業のときは、考えていることを全部発言しながら手を動かしてみると目先のタスクに目が向きやすくなるので割といい感じ。

 昨日も朝はニュースチェックから。昨日は高リフレッシュレートのゲーミングモニターが発売されるというものや、ルータの安全性をチェックするサイト、ワイヤレス充電の新規格Qi2などがニュースになっていた。


 読書はBashの運用効率を上げるべく、シェル芸について学んでいる。「難読化シェル芸の世界」といういい感じのタイトルの本で、難読化という目的のためにいろいろとコマンドのマニュアルを見ながら、その動作を学んでいる。非常に面白いし、Bashが一気に身近な存在に感じられるので、良い資料である。

謎挙動git push とクリスマスイブ

  おおよそ日報のようなもの。昨日はせっせと持ってきた本を読んだり、プログラムの状態を復帰したりした。夕方になってからスーパーに買い物に行って、休み期間中の飲み物などを買ったりした。世間はクリスマスイブということで、みんなパーティーとかをやっているのか、夕方の時間にもかかわらず店内は予想以上に閑散としていた。

 プログラムの様子がおかしい、というよりはgitの様子がおかしい。僕自身がgitをあまり良くわかっていないのが一番の原因といえば原因なのだが、リモートブランチにローカルブランチの内容をpushしようとしたときにcommitしていない内容までもがアップロードされるのはなんなのか。調べて解決する必要があるが、時間がなくて昨日は無理だった。多分今日の夜辺りになんとか解決する。

 持ってきた本の1冊である、gene著の「ネットワークの基本と仕組み」を読み終えた。以前にも紹介した1冊だが、平易な語り口と豊富な図解、例示を行ってネットワーク全体のことを幅広く書いたもので、マスタリングTCP/IPを読む際に非常に役に立っている。技術者でない人もターゲットに含めて作った感じの本だと思うが、VLANの挙動とか、MACアドレステーブルの挙動とか、一歩踏み込んだ話題も扱っているのがとても良いところである。

ネット修行とミュージックプレイヤー

  おおよそ日報のようなもの。昨日もゼミに出席したり、マスタリングTCP/IPを読み進めたりした。夜間にはCUIのミュージックプレイヤーのプレイリストのコードを書き換えたりした。

 マスタリングTCP/IP読みの進捗としては、ちょうど4章を読み終えたところである。IPv4、IPv6の説明を終えて、第5章のIP周りのプロトコル群に突入。今週末までにはトランスポート層まで行きたいところである。当初の僕の計画よりもずいぶんと遅い。でも、仕方ない。現実は厳しい。

 夜間のCUIミュージックプレイヤーは昨日の段階でようやくプレイリストの編集機能が追加された。まだ再生部分との統合ができていないが、機能的には曲目再生、プレイリスト再生、プレイリストの作成編集、ができるようになっている状態。ただし、プレイリスト再生についてはまだオートでの曲送りができないから、この点については改善を行う必要がある。以前も書いたかもしれないが、これには曲が停止しているかをチェックして停止時には曲をスキップ処理する非同期関数が必要である。あとは、ファイル周りとか、ガイドとかを充実させて、それなりに使えるように調整を行う。そしたらリリースできる。ようやくゴールが見えてきた感がある。簡単なツールではあるが、きちんとソフトウェアを頭から最後まで作ろうと思ったらそれなりに大変なんだなぁということがわかった。

非同期な朝食準備

  おおよそ日報のようなもの。昨日は非同期処理について少し勉強したり、TCPについて勉強したり、コンパイラの講義に出たりした。

 非同期処理の説明というと、個人的にはマイクロソフトのドキュメントの文章が印象深い。たしかC#の解説ドキュメントだったと記憶しているが、非同期処理を料理に例えて説明している。朝起きて、2枚のフライパンを温めて、トースターにパンをセットし、ベーコンを炒めて、タマゴを炒めて、牛乳を用意する。最後にパンを皿に載せて、ベーコン、タマゴの順で載せて完了。ここでは非同期処理が行われている。例えばトースターにパンをセットして焼くシーンだが、トースターをパンにセットしたあとは、人間は一度トースターに関する処理を手放して、ベーコンやタマゴを炒めるタスクに移行する。以降トースターに関しては、トースターが焼き上がりの通知を入れてくるまではノータッチになる。仮に焼き上がりの通知が上がったとしても、すぐに処理する必要はない。焼き上がり通知が入って、かつトースターのタスクを再度行うだけの時間的余裕があれば、処理を再開する。まさしく非同期処理。非同期処理に対立する概念として同期処理がある。これは逐次的にすべてのタスクをこなして行く方式で、トースターの例で言ったら、トースターにパンをセットしたあと、焼き上がるまでひたすらトースターを眺めて続け、パンが焼き上がったのを確認してからベーコンやタマゴを炒めるタスクに移行する、という状況だ。非常に効率が悪い。これは非同期処理と同期処理の違いを理解し、また、同期処理を非同期処理に置き換えることで効率を改善できる可能性があるということを示すとても良い例えだと思う。いつもいつも非同期に置き換えられるわけではないのだが、基本的に「一度行い、待つタスク」に関しては非同期に置き換えられる、そんな認識。

HSPをmakeするときにSDL2に関するファイルがないと言われる

 HSP(Hot soup processer)の環境を作ることにした。HSPの作業環境はWindowsのほかLinux、 Raspberry Piにも対応しているようで、以下のページでインストール方法が紹介されている。

https://www.onionsoft.net/hsp/v36/doclib/hsp3linux_pi.html

僕の環境はUbuntu20.04で、基本的にはaptを使ってインストールを行った。結果から言うと、このページに書かれているとおりにインストールを進めてもうまく行かなかった。

makeを実行したのあとに、SDL2/SDL_ttf.hがないとか、SDL2/SDL_image.hがないとか、SDL2/SDL_mixer.hがないとか言われる。また、curl/curl.hもないとか言われている。

SDLに関しては、ページで紹介するものではなくて、

libsdl2-ttf-dev libsdl2-image-dev libsdl2-mixer-dev

をダウンロードしたらうまく行った。

curl.hに関しては、libcurl4-nss-devというのを入れるとうまくいくらしい。あんまり良く調べていないので、このパッケージが何のためのものかはよくわからないのだが、参考ページによるとlibcurlというもののための開発用パッケージらしい。

参考 : https://lynxbee.com/how-to-resolve-fatal-error-curl-curl-h-no-such-file-or-directory-for-ubuntu-linux/#.Y5XLj9IX5H4

以上より、実行するコマンドは、

$ sudo apt install libsdl2-ttf-dev libsdl2-image-dev libsdl2-mixer-dev libcurl4-nss-dev

近況とpy_cui

 おおよそ日報のようなもの。午前中は進路希望調査票を書いたり、ゼミの資料を読んだりした。進路希望調査には進学を希望する内容を書き、その理由をつらつらと書いた。就職との兼ね合いとか、研究で得られる経験の有用性とか、トピックを深堀することで得られる思考力とか、そういうことを建前上書くわけであるが、本音は非常にシンプルである。僕はただただネットワークについて詳しくなりたいのだ。詳しく知った知識をどう活かしていくのか、というのは必要に迫られて毎回考えることなのである。
 午後にはゼミに参加したり、講義に出たりした。今日はルーティングテーブルの構成についていろいろと話を聞いた。
 夜間はコードを書くことにしているのだが、疲れてそのまま寝てしまった。コードは深夜に起きて書いた。

設計を軸足にする、ということを覚えた

 以前ブログで書いていた音楽プレイヤーの制作に取り掛かっていて、インタフェース以外の部分については徐々に完成形が見えるくらいの段階に来ている。

プログラミングアイデア。より直感的なUIのCUI音楽プレイヤー

 手前1週間くらい、インターネット中毒治療の一環で音楽プレイヤーをローカルで使えるものに変更している。使っているソフトはcmusというソフトで、ターミナル上で使えるミュージックプレイヤーである。僕の場合は常時tmuxを立ち上げているから、音楽プレイヤー用に1枚ウィンドウを増やして、そこでcmusを立ち上げる。切り替えも簡単だし、手軽でよいのだが、UIが馴染めない。すべての動作がボタンに割り当てられているのだが、割り当てられている操作が多すぎるし、操作モードごとに独自の操作があって覚えるのが面倒。そこで、もう少し簡素なUIを備えたCUI音楽プレイヤーを作るのはどうだろうか。cmusは大部分がcで書かれたソフトだが、コンピュータリソースは十分であるわけだし、ここはpythonとかで書いたらライブラリとか使って開発コストを下げられるので良いのではないか。

端っこを攻める

 ある対象セルの値を、その近傍の8セルの値によって決定したい。
画像処理などのプログラムではよく見かける処理で、3*3マスのフィルタを処理対象画像にラスタスキャンで適用し、画素値を計算したりする。
 今回は、ライフゲームを作成する最中に、このフィルタを盤面上のすべてのマスに適用して、次ターン盤面を計算したい。

コンパイルの流れをざっくり確認する


 10分くらい時間があるので、コンパイルの流れについて学習したことをざっくりとメモしておこう。なんとなくC言語を例に話を進める。