再発明する車輪を探している [プログラミング]
仕事だけでなく、趣味で(プライベートの時間で)プログラムを書いている。
自分で使う便利なものを作りたい、とかいうことはないので、書くものは何でも良い。
書いて、うまく動いたら
「わーい」
って喜びたい。
多少なりとも他人が使ってくれて、自分で書けるギリギリ難しいプログラムを書きたいと思っている。
新たな発明ができるほど天才でないので、車輪の再発明をしている
車輪の再発明って一般的な使われる言葉ではないかな?
昔は悪い意味で使われるだけだったが、最近は、意味ある場合もあるよーみたいなことになっているようだ。
https://ja.wikipedia.org/wiki/%E8%BB%8A%E8%BC%AA%E3%81%AE%E5%86%8D%E7%99%BA%E6%98%8E#%E8%BB%8A%E8%BC%AA%E3%81%AE%E5%86%8D%E7%99%BA%E6%98%8E%E3%81%8C%E6%84%8F%E5%91%B3%E3%82%92%E6%8C%81%E3%81%A4%E5%A0%B4%E5%90%88
65歳すぎたら、新しいライブラリを書き起こすことはできなさそうな予感がしてる(若宮正子さんすごい)ので、今、頑張りたい。
最近、再発明する車輪=趣味で書く(自分の能力で書ける)プログラムのネタが尽きているのが悩みだ。
自分で使う便利なものを作りたい、とかいうことはないので、書くものは何でも良い。
書いて、うまく動いたら
「わーい」
って喜びたい。
多少なりとも他人が使ってくれて、自分で書けるギリギリ難しいプログラムを書きたいと思っている。
新たな発明ができるほど天才でないので、車輪の再発明をしている
車輪の再発明って一般的な使われる言葉ではないかな?
昔は悪い意味で使われるだけだったが、最近は、意味ある場合もあるよーみたいなことになっているようだ。
https://ja.wikipedia.org/wiki/%E8%BB%8A%E8%BC%AA%E3%81%AE%E5%86%8D%E7%99%BA%E6%98%8E#%E8%BB%8A%E8%BC%AA%E3%81%AE%E5%86%8D%E7%99%BA%E6%98%8E%E3%81%8C%E6%84%8F%E5%91%B3%E3%82%92%E6%8C%81%E3%81%A4%E5%A0%B4%E5%90%88
65歳すぎたら、新しいライブラリを書き起こすことはできなさそうな予感がしてる(若宮正子さんすごい)ので、今、頑張りたい。
最近、再発明する車輪=趣味で書く(自分の能力で書ける)プログラムのネタが尽きているのが悩みだ。
式の構文解析 [プログラミング]
コンパイラとかインタプリタを書くのは、パソコン少年の憧れ。
フルスペックのプログラミング言語とか制御構文を書くのは難しいけど、いつか式の構文解析くらいやってみたいと思っている。
しかし、「やってみました」の自己満足だけでやる気力はなく、それでいて式の構文解析だけで役に立つ場面がない。
(以下、自分へのメモ)
再帰下降パーサ
https://qiita.com/nomunomu0504/items/26c02aa4a5311ddcf856
https://ja.wikipedia.org/wiki/%E5%86%8D%E5%B8%B0%E4%B8%8B%E9%99%8D%E6%A7%8B%E6%96%87%E8%A7%A3%E6%9E%90
Python で書かれたパーサ
pyparsing https://github.com/pyparsing/pyparsing
SQLパーサ
sqlparse https://github.com/andialbrecht/sqlparse
SQLite3のためのSQLリファレンス
https://qiita.com/tetr4lab/items/691ceeb528d6144547c8
フルスペックのプログラミング言語とか制御構文を書くのは難しいけど、いつか式の構文解析くらいやってみたいと思っている。
しかし、「やってみました」の自己満足だけでやる気力はなく、それでいて式の構文解析だけで役に立つ場面がない。
(以下、自分へのメモ)
再帰下降パーサ
https://qiita.com/nomunomu0504/items/26c02aa4a5311ddcf856
https://ja.wikipedia.org/wiki/%E5%86%8D%E5%B8%B0%E4%B8%8B%E9%99%8D%E6%A7%8B%E6%96%87%E8%A7%A3%E6%9E%90
Python で書かれたパーサ
pyparsing https://github.com/pyparsing/pyparsing
SQLパーサ
sqlparse https://github.com/andialbrecht/sqlparse
SQLite3のためのSQLリファレンス
https://qiita.com/tetr4lab/items/691ceeb528d6144547c8
新たにプログラミングを学ぶことのおわり [プログラミング]
新しく出てきたり、昔からあったにしても新たに脚光を浴びるようになったりしたプログラミング言語を知ると、読み書きできる程度にマスターしたくなってくる。
自分でもはっきりとはわからないけれども、以下のような理由からだと思う。
1. 急に仕事でやれと言われても困らないように準備しておきたいという気持ち
2. 自分の知っているプログラミング言語よりもずっと素早く効率的に書けて知らないと損するんじゃないかという恐怖感
3. 世の中が、その素晴らしいプログラミング言語を使うのが当たり前になって転職できなくなる
3. は 1. と同じかもしれない。
最近、仕事で使うか使わないかわからないプログラミング言語を労力を割くのがしんどくなってきている。
前よりも、理解も遅いし。
今、仕事では Python を使っている。
会社で、Python をメインに使っていくことはこれからも変わりそうにないし、定年まであと10年くらいで、ライブラリの充実度を考えると、自分がこれからあえて他のプログラミング言語を使うことになるとは考えづらい。
そうすると、これから新たにプログラミング言語を学ぶよりは、自分がある程度書けているプログラミング言語の練習をする方がいい年齢になってきたかなと思う今日この頃。
自分でもはっきりとはわからないけれども、以下のような理由からだと思う。
1. 急に仕事でやれと言われても困らないように準備しておきたいという気持ち
2. 自分の知っているプログラミング言語よりもずっと素早く効率的に書けて知らないと損するんじゃないかという恐怖感
3. 世の中が、その素晴らしいプログラミング言語を使うのが当たり前になって転職できなくなる
3. は 1. と同じかもしれない。
最近、仕事で使うか使わないかわからないプログラミング言語を労力を割くのがしんどくなってきている。
前よりも、理解も遅いし。
今、仕事では Python を使っている。
会社で、Python をメインに使っていくことはこれからも変わりそうにないし、定年まであと10年くらいで、ライブラリの充実度を考えると、自分がこれからあえて他のプログラミング言語を使うことになるとは考えづらい。
そうすると、これから新たにプログラミング言語を学ぶよりは、自分がある程度書けているプログラミング言語の練習をする方がいい年齢になってきたかなと思う今日この頃。
MongoDB 3.6 以降の新しい(それほど新しくない) OPCODE の話 [プログラミング]
以前 mongodb のデーターベースドライバーを書いて https://nakagami.blog.ss-blog.jp/2016-12-08
最終的に TLS接続して CosmosDBに接続できるようにした https://nakagami.blog.ss-blog.jp/2020-10-17
MongoDB 4.x に nmongo から接続できないことには気づいていたが、その原因については調べてなかった。
重い腰を上げて調べてみると、MongoDB 4.4 の mongo shell から MongoDB に接続するときには
Mongo 3.6 からできた OP_MSG と言うオペコードでデータのやりとりをしているようだった。
https://docs.mongodb.com/v3.6/reference/mongodb-wire-protocol/
ここに、日本語の解説があった
http://www.cybergarage.org/memo/mongodb-wire-protocol/
nmongo や、 MongoDB 3.x の mongo shell は、OP_COMMAND, OP_COMMANDREPLY を使っていたのだが、使えなくなったらしい
MongoDB 4.0以降 で使えるようにするためには、OP_MSG を使うしかないようだが、nmongo の拡張では難しい?簡単?
やるなら別のドライバーを書くことになるかなぁ、というあたりまで確認した。
MongoDB が OSS でなくなったこともあり、どうしてもやりたい!という気はしない。
当面はこのまま。
最終的に TLS接続して CosmosDBに接続できるようにした https://nakagami.blog.ss-blog.jp/2020-10-17
MongoDB 4.x に nmongo から接続できないことには気づいていたが、その原因については調べてなかった。
重い腰を上げて調べてみると、MongoDB 4.4 の mongo shell から MongoDB に接続するときには
Mongo 3.6 からできた OP_MSG と言うオペコードでデータのやりとりをしているようだった。
https://docs.mongodb.com/v3.6/reference/mongodb-wire-protocol/
ここに、日本語の解説があった
http://www.cybergarage.org/memo/mongodb-wire-protocol/
nmongo や、 MongoDB 3.x の mongo shell は、OP_COMMAND, OP_COMMANDREPLY を使っていたのだが、使えなくなったらしい
MongoDB 4.0以降 で使えるようにするためには、OP_MSG を使うしかないようだが、nmongo の拡張では難しい?簡単?
やるなら別のドライバーを書くことになるかなぁ、というあたりまで確認した。
MongoDB が OSS でなくなったこともあり、どうしてもやりたい!という気はしない。
当面はこのまま。
git で 特定の tag にブランチを戻す [プログラミング]
普段、事故ったりハマったりするのがいやで、 git で rebase はしていない。
歴史は修正しない主義。
本当は、綺麗に rebase してコミットログを整えるほうがいいのかもしれないけど。
ところが、諸般の事情により、主義に反して、特定の tag までブランチの HEAD を戻す必要が出てしまった。
ありがたいことに、ここに答えが載っていた
https://stackoverflow.com/questions/6872223/how-do-i-revert-master-branch-to-a-tag-in-git
これで、 master の HEAD を tag_ABC に設定できた。
この程度のことは、することあるかもしれないので、ここにメモっておく。
歴史は修正しない主義。
本当は、綺麗に rebase してコミットログを整えるほうがいいのかもしれないけど。
ところが、諸般の事情により、主義に反して、特定の tag までブランチの HEAD を戻す必要が出てしまった。
ありがたいことに、ここに答えが載っていた
https://stackoverflow.com/questions/6872223/how-do-i-revert-master-branch-to-a-tag-in-git
git checkout master git reset --hard tag_ABC git push --force origin master
これで、 master の HEAD を tag_ABC に設定できた。
この程度のことは、することあるかもしれないので、ここにメモっておく。
長く使える技術を予測するのは難しい [プログラミング]
息子が、ここ数日、迷路の深さ優先探索のプログラムを書いている。
大学のアルゴリズムのコマで説明する必要があって、プログラムを書く必要はないのだがサンプルプログラムで示せたほうが良かろうという考えらしい。
ウィンドウに迷路が表示されて、その迷路を探索する様子がグラフィカルに描かれるんだけど GUI ツールキットは AWT (プログラミング言語は Java)だそうな。
自分は、以前 Swing で GUI アプリケーションを書いたことはあったが、AWT で書いたことはない。
Swing のコードを書いていた頃(10年以上前)は、すでに AWT は「古いもの」「遅くて使えないもの」という位置づけで、そのうちなくなるものだと思っていた。そのうち「Swing はもう古い、これからは JavaFXだ」ということを言われて、「そっかー。俺の Swing の経験は無駄になっちゃったかー」と思った。
まさか、ここにきて、新しい OpenJDK から JavaFX が外され、息子が彼の生まれる前にできていた GUI ツールキットを使って迷路を描画しているとは思わなかった。
大学のアルゴリズムのコマで説明する必要があって、プログラムを書く必要はないのだがサンプルプログラムで示せたほうが良かろうという考えらしい。
ウィンドウに迷路が表示されて、その迷路を探索する様子がグラフィカルに描かれるんだけど GUI ツールキットは AWT (プログラミング言語は Java)だそうな。
自分は、以前 Swing で GUI アプリケーションを書いたことはあったが、AWT で書いたことはない。
Swing のコードを書いていた頃(10年以上前)は、すでに AWT は「古いもの」「遅くて使えないもの」という位置づけで、そのうちなくなるものだと思っていた。そのうち「Swing はもう古い、これからは JavaFXだ」ということを言われて、「そっかー。俺の Swing の経験は無駄になっちゃったかー」と思った。
まさか、ここにきて、新しい OpenJDK から JavaFX が外され、息子が彼の生まれる前にできていた GUI ツールキットを使って迷路を描画しているとは思わなかった。
令和対応で不具合 [プログラミング]
振込予定日が、本来 2019-05-07 と出るべきところ 1989-05-07 と出る不具合が発生しているそうで。
北陸銀行の、このお詫びだけでなく、
https://www.hokugin.co.jp/info/important/archives/personal/2019/1625.html
類似の不具合が、 NTT データの基盤の上に乗っている地銀で発生していて、地銀で共有している NTTデータの基盤以外にも、同じようなことが発生している?
内部的なデータを、和暦の年月日で持っていて、令和1年5月7日振込を、平成1年5月7日と判定してしまうための模様。
平成の間の処理で、振込期日(返済期日)が令和になるときの表示がおかしいけど、ATM を操作した日が令和(5/1以降)だと、ほっておいても正しく表示されるんだと思う。
そうはいっても
「ああ、表示だけの問題だし、ほっておけば、5/1には直りますよ」
とは言えず、中の人は10連休がなくなってしまったのかな。
内部的に、(おそらく元号なしの)和暦で持っていて、和暦→西暦変換してるとは思わなかったが、今回の新元号対応した人たちにはどうしようもないことである。
やれ、下請けがコード書いてるだの、開発力が、だの言われているが、今回のは、テスト環境が制限されていたんだと思う。
末端のソースコードを修正していた人たちは、机上でそれっぽいところを修正しても、気軽に動作確認できるテスト環境がなかったのではないか。
そうじゃなければ、見てみたら一瞬でわかるような不具合に気づかないわけないと思うのだが・・・
もしかして、ATM 機器側で修正しないといけないものがあったの気づかなかったのかな?
ローソンの ATMだけらしいから、間違った西暦に変換してるのが ATM側のせいだとすると、それはきついな。
いずれにせよ、こんなぱっと見ダメってわかるような不具合が銀行システムで見つけられないというのは、日本の IT業界、大変なことであるな。
(追記)お、これは、原因わかってる表示の不具合なので休出しません。なのかな。そうだといいな
https://togetter.com/li/1342653
https://www.sankei.com/smp/economy/news/190429/ecn1904290002-s1.html
北陸銀行の、このお詫びだけでなく、
https://www.hokugin.co.jp/info/important/archives/personal/2019/1625.html
類似の不具合が、 NTT データの基盤の上に乗っている地銀で発生していて、地銀で共有している NTTデータの基盤以外にも、同じようなことが発生している?
内部的なデータを、和暦の年月日で持っていて、令和1年5月7日振込を、平成1年5月7日と判定してしまうための模様。
平成の間の処理で、振込期日(返済期日)が令和になるときの表示がおかしいけど、ATM を操作した日が令和(5/1以降)だと、ほっておいても正しく表示されるんだと思う。
そうはいっても
「ああ、表示だけの問題だし、ほっておけば、5/1には直りますよ」
とは言えず、中の人は10連休がなくなってしまったのかな。
内部的に、(おそらく元号なしの)和暦で持っていて、和暦→西暦変換してるとは思わなかったが、今回の新元号対応した人たちにはどうしようもないことである。
やれ、下請けがコード書いてるだの、開発力が、だの言われているが、今回のは、テスト環境が制限されていたんだと思う。
末端のソースコードを修正していた人たちは、机上でそれっぽいところを修正しても、気軽に動作確認できるテスト環境がなかったのではないか。
そうじゃなければ、見てみたら一瞬でわかるような不具合に気づかないわけないと思うのだが・・・
もしかして、ATM 機器側で修正しないといけないものがあったの気づかなかったのかな?
ローソンの ATMだけらしいから、間違った西暦に変換してるのが ATM側のせいだとすると、それはきついな。
いずれにせよ、こんなぱっと見ダメってわかるような不具合が銀行システムで見つけられないというのは、日本の IT業界、大変なことであるな。
(追記)お、これは、原因わかってる表示の不具合なので休出しません。なのかな。そうだといいな
https://togetter.com/li/1342653
https://www.sankei.com/smp/economy/news/190429/ecn1904290002-s1.html
2019-04-29 20:10
コメント(0)
Java 10 が出てしまった [プログラミング]
JDK 1.0 か JDK 1.1 の頃に、状態によって四角を緑と赤に描き分ける Applet を書いたことがある。
まあ、おもちゃみたいなもので、とても書いたことがあると言えるような経験ではなかったが、
職業プログラマーとして、いつかは Java のコードを書くんじゃないかと思って来た。
Java 8 までは、この本を読んだり

Java 8 Oracle JDK をインストールしてみたりしてみたりしていたが
http://nakagami.blog.so-net.ne.jp/2014-03-22
「Java 9 では jshell なんてのが使えるんだー」
と思いながら、Java9 について何もしないまま Java 10 が出てしまった。
var で型推論するコードなんか見てもなじめそうにない。そして、あと半年すると Java 11 が出てしまうらしい。
もうだめだ。ついていけなくなった。
Perl, PHP, JavaScript, Scala といった「勉強したけど挫折したプログラミング言語リスト」の中に Java が加えられてしまった。
・・・といいつシンタックス上の変更について調べてしまう。
流行りの型推論が導入されるらしい。
Go言語だと、宣言での型の指定が後置になっていて、型の部分を省略すると推論するようになってるんだけど、
Java 10 の場合、型を書くべきところに var って書くようになっていて、それだったら型書いたほうが読みやすくない?
って思ってしまう。
もうだめだと思ったが、 Java 9 では jshell が Java 10 では型推論が使えるようになったくらいかな?
まあ、おもちゃみたいなもので、とても書いたことがあると言えるような経験ではなかったが、
職業プログラマーとして、いつかは Java のコードを書くんじゃないかと思って来た。
Java 8 までは、この本を読んだり

Java 8 Oracle JDK をインストールしてみたりしてみたりしていたが
http://nakagami.blog.so-net.ne.jp/2014-03-22
「Java 9 では jshell なんてのが使えるんだー」
と思いながら、Java9 について何もしないまま Java 10 が出てしまった。
var で型推論するコードなんか見てもなじめそうにない。そして、あと半年すると Java 11 が出てしまうらしい。
もうだめだ。ついていけなくなった。
Perl, PHP, JavaScript, Scala といった「勉強したけど挫折したプログラミング言語リスト」の中に Java が加えられてしまった。
・・・といいつシンタックス上の変更について調べてしまう。
流行りの型推論が導入されるらしい。
Go言語だと、宣言での型の指定が後置になっていて、型の部分を省略すると推論するようになってるんだけど、
Java 10 の場合、型を書くべきところに var って書くようになっていて、それだったら型書いたほうが読みやすくない?
って思ってしまう。
もうだめだと思ったが、 Java 9 では jshell が Java 10 では型推論が使えるようになったくらいかな?
Ubuntu 17.10 でAngular 環境を用意する [プログラミング]
notejs とか npm とかよくわかんないから、はまるのやだなーと思って避けてたけど Ubuntu 17.10 だと、apt ではまらずにインストールできたっぽい
$ sudo apt install nodejs npm
$ sudo npm install -g @angular/cli
$ sudo npm install -g typescript
$ nodejs -v
v6.11.4
$ npm -v
3.5.2
$ tsc -v
Version 2.7.2
npm install でワーニング出て、よくわかんないけどそういうもんなの?
$ ng new my-app
$ cd my-app
$ ng serve --open
でブラウザーで http://localhost:4200/ にアクセスすると Angular のスタート画面が出た
(追記)
ここまでの手順で良さそうではあるのだが、nodejs は、もっと新しいのを入れるのがいいの?
http://jsstudy.hatenablog.com/entry/Difference-in-version-of-Nodejs
https://nodejs.org/ja/download/releases/
ここ↓を参考にして、最新にしたほうがいいのかなぁ・・・
https://qiita.com/seibe/items/36cef7df85fe2cefa3ea
やっぱり、よくわからない
$ sudo apt install nodejs npm
$ sudo npm install -g @angular/cli
$ sudo npm install -g typescript
$ nodejs -v
v6.11.4
$ npm -v
3.5.2
$ tsc -v
Version 2.7.2
npm install でワーニング出て、よくわかんないけどそういうもんなの?
$ ng new my-app
$ cd my-app
$ ng serve --open
でブラウザーで http://localhost:4200/ にアクセスすると Angular のスタート画面が出た
(追記)
ここまでの手順で良さそうではあるのだが、nodejs は、もっと新しいのを入れるのがいいの?
http://jsstudy.hatenablog.com/entry/Difference-in-version-of-Nodejs
https://nodejs.org/ja/download/releases/
ここ↓を参考にして、最新にしたほうがいいのかなぁ・・・
https://qiita.com/seibe/items/36cef7df85fe2cefa3ea
やっぱり、よくわからない
Neo4j をさわってみる [プログラミング]
自分は macOS Sierra にインストールして使ってみたかったので
「MacでNeo4jを使ってみる」が参考になった
http://qiita.com/awk256/items/a4c7457aad103a07e5d6
これ↑を見てもらうのが良いのだが、もしページが消えちゃうと困るので
自分でやった操作をいかにメモしておく。
java8 はインストール済み
Community Edition ダウンロードページ
https://neo4j.com/download/community-edition/
の Neo4j 3.1.1 MacOS (dmg) というのをダウンロードして実行して
インストール(いつものように Application フォルダーアイコンにドラッグ&ドロップ)
Application フォルダーの「Neo4j Commmunity Edition 3.1.1」を開いて start。
http://localhost:7474/ で
初期の ID とパスワードは neo4j/neo4j だけどログインしたら新しいパスワードを
聞かれるので設定
コマンドシェルで
:play movie graph
を実行。
出てくるクエリ文の枠の中をクリックするとコマンドラインにコピーされるので
それを実行。
これで映画データーベースが読み込まれた。
tarball を落として動かすのは、(CentOS 7 関係なく)これ↓が参考になりそう
さくらVPS上のCentOS 7にNeo4jインストールしてローカルからアクセス出来るようにした
http://postmaster.hatenablog.com/entry/2016/04/16/085549
以前は、Java のネイティブメソッドか Rest API でアクセスしてたんだけど、
割と最近、Neo4j 3.0 から Bolt Protocol というプロトコルでアクセスできるようになった
http://www.creationline.com/lab/14847
Bolt Protocol でアクセスするデーターベースドライバーは python だと
$ pip install neo4j-driver
でインストールできるっぽい
Bolt Protocol
http://boltprotocol.org
Bolt Protocol, Version 1
http://boltprotocol.org/v1/
「MacでNeo4jを使ってみる」が参考になった
http://qiita.com/awk256/items/a4c7457aad103a07e5d6
これ↑を見てもらうのが良いのだが、もしページが消えちゃうと困るので
自分でやった操作をいかにメモしておく。
java8 はインストール済み
Community Edition ダウンロードページ
https://neo4j.com/download/community-edition/
の Neo4j 3.1.1 MacOS (dmg) というのをダウンロードして実行して
インストール(いつものように Application フォルダーアイコンにドラッグ&ドロップ)
Application フォルダーの「Neo4j Commmunity Edition 3.1.1」を開いて start。
http://localhost:7474/ で
初期の ID とパスワードは neo4j/neo4j だけどログインしたら新しいパスワードを
聞かれるので設定
コマンドシェルで
:play movie graph
を実行。
出てくるクエリ文の枠の中をクリックするとコマンドラインにコピーされるので
それを実行。
これで映画データーベースが読み込まれた。
tarball を落として動かすのは、(CentOS 7 関係なく)これ↓が参考になりそう
さくらVPS上のCentOS 7にNeo4jインストールしてローカルからアクセス出来るようにした
http://postmaster.hatenablog.com/entry/2016/04/16/085549
以前は、Java のネイティブメソッドか Rest API でアクセスしてたんだけど、
割と最近、Neo4j 3.0 から Bolt Protocol というプロトコルでアクセスできるようになった
http://www.creationline.com/lab/14847
Bolt Protocol でアクセスするデーターベースドライバーは python だと
$ pip install neo4j-driver
でインストールできるっぽい
Bolt Protocol
http://boltprotocol.org
Bolt Protocol, Version 1
http://boltprotocol.org/v1/