ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

Pythonの勉強をすることになりました

2018-01-08 20:13:11 | プログラミング

Pythonの勉強をすることになりました。
2017年末~2018年正月のほとんどはPythonに消えましたぞ^^;

最近機械学習というものが流行っておりまして、そのライブラリーを呼ぶのにPythonがけっこう使われているらしいんですな。で、Pythonを使っている機械学習の本をちょっと見てみたところ、なんとなくは分かるものの、やはり細かいところは理解できない。
というわけでPythonを勉強してみたわけですな。
その結果、理解できないと思った辺りはスライス記法だったらしいということが分かりましたw(これは確かにJavaScalaには無い)

Pythonは最近よく聞くようになったとはいえ、Javaと同世代の言語。
なので、オブジェクト指向と言う割にはメソッドと組み込み関数のどちらを使うのか整理されていなかったりする点は歴史的経緯から仕方ないんでしょうね^^;
しかしリストやタプルは操作しやすそうだし、変数に型が無い分、クラス関数関連の文法はかなりシンプル。
あと、内包表記というものが初めて理解できたw(Scalaのfor yield式が内包表記と呼ばれることがあったんだけど、どこが「内包」なのか分からなかった。Pythonのは括弧に囲まれているので、確かに内包されてるわw)

まぁ、Pythonの使い道が機械学習等のライブラリー呼び出しがメインということであれば、複雑なクラスを作ったりすることは無いだろうから、そういう人にとってはこれくらいの言語で良いのかも。


現場で役立つシステム設計の原則

2017-07-09 18:51:38 | プログラミング

現場で役立つシステム設計の原則』が話題になっていたので、(流し読み程度だけど)読んでみた。

基本的にはJavaがベースで、前半(というか最初の2章くらい)はコーディングレベルの話、残りはオブジェクト指向ベースの設計方法の話。

あ、ちなみに自分は最近はAsakusa Frameworkというバッチフレームワークを使う仕事が多いのでバッチ寄りの考え方で読んでいるけど、本書は基本的にウェブ寄り(Spring Framework)の思想っぽい。


コーディングレベルの話はとても納得。Javaでプログラミングする人は全員これを確認しておくべきという感じ。

(とても細かいレベルの事を言うと、if文の処理部分は波括弧で囲んだ方が(余計なバグが入る余地を減らせるので)いいと思う。ただ、書籍なので、行数を減らすために波括弧で囲んでいないのかもしれない)
(p.60でenumの列挙子が小文字なのはJavaの慣習からすると違和感がある。ただ、これもそういうコーディング規約だというなら、それでいいかも)

p.32の値を扱うための専用クラスを作る話とかは、理想はその通りだと思うんだよね~。java.timeなんかはそういう思想っぽいし。
ただ、Javaだとそのクラスを使った演算とか書くのが面倒なんだよねorz(c = a.plus(b)みたいな)
Scalaだと+等の記号を使った演算子が定義できるけど、実行速度はプリミティブ型よりは落ちる気がするし…。
(こういうのが得意なプログラミング言語はそろそろ有りそうな気はするけど、聞いた事は無いな…)

p.75の「データクラスが広く使われているのはなぜか」では、StrutsやJ2EEを真っ向からdisっていて、すげー!って感じ(笑)


後半からは設計に関する話になっていく。
クラス設計だけではなく、DBのテーブル設計や画面設計、Rest APIの話題まである。

ただ、この辺りから自分の常識とは違う内容が多くなってきて、戸惑う。
ただ単に自分の頭が固くなって受け入れられないだけなのか。別の人の評価を聞いてみたいところ。

p.137の「用語集が育っていく」という話は超同意。
初めて入るプロジェクトでは、まず用語集を確認するし。(と言っても、用語集が作られているプロジェクトなんてほぼ皆無だけど(苦笑))
そして、プロジェクトが進んで業務理解が深まってくると、用語もきちんと分かってきて、メソッド名とかクラス名とかシェル名を直したくなる(爆)
(余談だけど、AsakusaFWでは、処理(フロー)の為のメソッドをvocabulary(語彙)と呼ぶ。これは業務用語を意味し、「フロー上は業務用語を使って処理を記述する」という思想の表れだと思う)

6章のデータベースの設計は、一番戸惑いが多い。
本来なら、理解できない所ほどちゃんと読むべきなんだけど、流し読みしかしてないせいか^^;

p.183の取り消しデータの作成って、履歴系のテーブルならそうかもしれないけど、マスター系もそれだと、最新の情報を取得するのが面倒になるのでは? プライマリキーにも履歴項目が増えそうだし。

p.184のカラムの追加はテーブルの追加でって、恐ろしいな^^;
パフォーマンスの悪影響は大きそうだし、そのテーブルを使うアプリケーションの修正もカラム追加より大きくなるのでは?
虚データを入れないようにするという事自体はとても正しいと思う。本来は追加したカラムに移行データとして何らかの値を入れるべきで、ただ、そう出来ないケースの事を考えているのだと思うけど。追加したカラムのnullチェックの代わりにテーブルの有無チェックが入るだけだろうから、全般的に利点があまり感じられないっす。
自分はDBのテーブルもオブジェクト指向のクラスと同様に「責務」があると思っていて、本来その責務の範疇のカラムなのに、値が無いかもしれないから別テーブルとする、というのは、どうかなーと思う。

p.186のUPDATEを使わずDELETE/INSERTにするというのも、最初はえーっ!と思ったけど。
DBMSによってはパフォーマンスが違うだろうし、DBMSによってはUPSERT(MERGE文)という構文があったりするし。
ただ、よく考えてみると、AsakusaFWだとDBアクセスはDELETE/INSERTが基本なんだよね。
というかバッチなので、テーブルから全対象データをバルクリード(SELECT)し、処理をメモリー(あるいはシンプルなファイル)上でまとめて行い、結果をバルクロード(DELETE/INSERT)する。
本書はたぶんウェブ想定なので、プライマリキー毎にDELETE/INSERTであって、AskusaFWの使い方とは違うだろうけど。

とかくDBアクセスはボトルネックになりやすいので、自分としては、どうしてもパフォーマンスのことが先に来てしまう^^;
パフォーマンスのことを気にしないなら、表面上はオブジェクト指向のクラスに載せて、いくらでも綺麗にコーディングできるんだよねぇ。(そしてN+1問題とか発生するorz)
(AsakusaFWを使うようになってからは、DBアクセスは最初と最後のバルク処理だけ済むので、とても楽になったw)

7章の画面(ウェブ)で印象的だったのは、p.215 HTMLのclass属性の値を決めるのがドメインオブジェクトだ、というところ。
画面を作る責務を担うオブジェクト、だったらHTMLの内容をいくら持っていても全く違和感ないんだけど、そういう事なのかな?

8章のアプリケーション連携では、Rest APIについても触れられていた。
Rest APIはあまり携わった事が無いんで何とも言えないんだけど、p.259の日付の話はダウトな気がする。
そもそもRest APIは人間が見るものではない(JSONだから見ようと思えば見られるけどさ)と思うので、日付は世界標準の形式で出力した方が良いのではないかと思う。
(人間が見られる形に変換するのは、Rest APIでデータを取得した側の責務では?)
少なくとも、年月日であればタイムゾーンは関係ないというのは、違うんじゃないかなぁ。(日本でしか使わないRest APIなら、それでいいのかもしれないけど)

9章の開発プロセス、p.276のソースを第一級のドキュメントとして活用する話は、下手すると物議を醸しそうですなぁw
(自分も『設計書は必要』ってブログを書いた事があるしな~w)
実際、顧客に見せる/同意を取る為のドキュメントを除けば、基本的にはソースとソースの説明書(ソースで表現しきれない部分を補う)があれば事足りる、というか、楽だよねぇ。
本書では打ち合わせでホワイトボードに書いた内容は写真で撮っておけばいいじゃんみたいな感じっぽいので(たぶん語弊有り^^;)、そういう面まで含めて考えているのかなぁ?
(ちなみに、今の自分の仕事ではホワイトボードの写真を見せられることが結構あるんだけど、写真だけで説明が無いと、その打ち合わせに出ていなかった人には伝わらない事の方が多いですよorz)

以上、なかなか刺激的な本なので、ぜひ他の人の感想を聞きたいw

 


SIは楽しいよ!(状況による)

2016-04-15 02:12:27 | プログラミング

今週バズった話題:富士通を退職した話「SIer が天職です」って人はどこにいるの?に関連してあるツイートを見かけたので、Asakusa Frameworkを使っている身としては反応せねばなるまいっ。
「AsakusaFWを使うSIは楽しいよ!」w(ステマ)


まぁ冗談は置くとして、自分が今勤めている会社はAsakusaFWを扱っている会社であってSIerではありませんが、自分がやっている仕事はお客さんのシステムのバッチをAsakusaFWで作ることなので、SIと言えると思います。

つい先日Asakusa on M3BPが出たので、今はその検証をやっています。バッチの種類によるけれども、実行時間がAsakusa on Sparkより2~10倍(平均3~4倍)くらい速くなったので、とても楽しいですw
AsakusaFWはアプリケーションのソースを変更せずにHadoopSpark・M3BP用の実行バイナリーを作れる点が素晴らしい。(データサイズに応じて実行環境を変えるという運用が簡単に出来る)
(ちなみに、書いたアプリケーションがソート順に依存していたり、想定外データ(マスターなのに同一キーで複数レコードあったりorz)があったりすると実行環境によって違いが出てきます。自分が作った部分からバグを発見するとへこみますねorz 他人のバグを見つけるのは楽しいんですが(爆))

ただ、こういうことが出来るのは、仕事内容(お客さん)次第だろうとは思います。


自分は、今の会社に転職する前は、典型的なSIerに勤めていました。 
SIerにも当然すごい人は居るんですが、あまり表に出てこないと思います。

例えば、自分がJavaを教わったと思っている人が3人いますが(その人達は、Struts1が出るか出ないかの頃にウェブフレームワークを作っていた)、たぶんTwitterとかはやっていないと思います。ある人は、自宅にPCを持っていないと言っていました。会社でさんざん触ってるから、家では触りたくないって^^;
あと、管理職でも尊敬できる人がいました。自分はリーダーとか向いてないので、ああいう人はすごいなぁと思います。でも堅い会社で堅い立場だと、自由に情報を発信したりはしないでしょうね。

そういう訳で、SIerが天職だという人がいても、外からそういう人を知る機会はあまり無さそうな気がします。

ちなみに自分はホームページとか書いていて今の会社の人の目に留まったので、転職したいなら、やはり人に存在を知ってもらえるようなことをした方が良いと思います。(自分のホームページは、転職目的で始めた訳ではないですが^^;)


SIer自体は、システムを作るのが本業ではない会社(プログラムを書けない人)の代わりにシステムを作る(プログラムを書く)仕事なので、その存在自体は至極自然のものだと思います。

が、日本では立場が強い方(お金を払う方)が立場の弱い方に無理難題を言う傾向があり、それがSIerの仕事をつらいものにしている気がします。まぁ、SIerに限った話ではないと思いますが…。

だから、発注者・受注者の関係であっても、お互いに尊重しあって仕事が出来るなら、楽しく(というか不必要に嫌な思いをせずに)仕事が出来ると思います。信頼関係大事。

ちなみに、SIer時代はNTTデータさんとよく仕事をさせていただきました。
NTTデータの人はやはり基本的にプログラムを書かない(あまり書かせてもらえない模様)ですが、顧客との折衝・仕様確定やスケジュール管理・受け入れ試験等はきちんとやっていた印象があります。(その為の資料作りは大変でしたけどね^^;)
一方、○○通は友人が(SI部門ではないけど)就職したので話を聞いたこともありますが(以下略)。社名は誰でも知っている大企業なだけに、新卒の人からすると魅力的に見えるんでしょうねぇ。
(個人的に、富士通は昔からあまり好きではないんですよねー。X68000のライバル、FM-TOWNS!w) 


蛇足ながら、今自分が勤めている会社は、PCは好きなOSでよい、ディスプレイも大きいのが2~3台、ノートPCも貸与、背広じゃなくていい、出勤時刻がほぼ自由、お昼ご飯の時間も自由(たいてい店が混んでる時間帯を避ける)、基本的に1日8時間だけど用事(勉強会とか)があるときに早退しても問題ない(申請とか不要)、疲れたら昼寝してもいい、ももクロのコンサートへ行く為に有休をとるのは当たり前(?)(注・僕のことではありません。なお、ゲームが発売されたときに有休をとるのは当たり前でしょうw)等、環境面でもとても働きやすいです。

という訳で、プログラムを書く仕事は、とても楽しいですよ!
(しかし、やはり一般的なSIerが楽しいとは言いづらい(苦笑)) 


プログラミングの勉強を始める前に覚えておくべきこと

2015-10-21 23:08:59 | プログラミング

昨日今日で話題になっていたこと。

3つ目が今回気になった話。
僕はウェブページでプログラミング関連のメモを公開している。「自分のメモ」ではあるのだけれど、一応公開していることもあり、情報を他の人にどう伝えるかということにも興味を持っている。そういう訳で、(文系かどうかはともかく)どこでつまづくか、という話は興味がある。

で、プログラミング言語を学ぶに当たり、最初に心構えみたいなものを説明しておくのがいいような気がした。


プログラミング言語というのは、誰かが作ったものであり、その製作者が決めたルールに従っている。
したがって、「なんでそうなっているんだ?」と思っても、製作者が決めたものだ、ということでひとまず従うしかない。
(また、コンピューターは融通が利かないので、コンピューター側のルールに従わないと上手く動いてくれない)
たいていはそういうルールになっている理由(や歴史的経緯)があるけれども、説明する側からしても、初心者にいきなり理由を説明するのは難しい。慣れてくれば分かってくることもあるので、最初はとにかくルールを覚えるしかないと思う。

でもこれってたぶん、プログラミング以外でも同じじゃないかな?
僕は武術とかは習ったことは無いけれども、理由は分からなくても「型」を学ぶところからスタートするんじゃないかと思うw

あと、業界独特の言い方ってものもあるので、聞いたことがない言葉であっても、いちいち引っかかってないで、ひとまずそういうものだと思って受け流すのがいいんじゃないかな。
「Hello, World」とか「おまじないと思って」とかの言い回しも、プログラミング業界用語だ(笑)


(2015/10/26追記)

この「おまじないと思って」は、「必要だけれどもその理由を初心者に説明しづらいから、説明を保留する」というニュアンス。
(必要なければ、そもそも初心者に書かかせたりしない)
だから、最初は言われるままにとりあえず書いておけばいいけれども、仕事でプログラムを書くなら、それまでに必要な理由は理解しないといけないと思う。
(C言語でプログラミングするのに#includeを理解してないとか、あり得ないから!) 

ちなみに、良い入門書は、そういう必要な事項が順番に学べるようまとまっている。ネットで手に入る情報は断片的な事が多い(ピンポイントで何かトラブルを解決したいときはネットの方が便利かもしれない)ので、やはり勉強するときは入門書を読むのがいいと思う。
で、なるべくなら、入門書は2冊以上読むのがいい。1冊だけだと内容が偏っている可能性があるから。


最近(2015年)の自分のソフトウェアリリース方法

2015-10-19 23:41:50 | プログラミング

やってる人にとっては全く当たり前の事なんだけど、最近EmbulkのプラグインやAsakusaFWのツールを作っていて改めて思ったこと。
ライブラリーのリリース方法が簡単になったねー!

昔から自作ソフトやツールを作って公開していたんだけど、実行ファイルの類であれば、説明書などを同梱したzip等のアーカイブファイルをダウンロードできる場所(ウェブページ)に置いておけばいい。

Javaのjarファイルといったライブラリーだと、同じくダウンロードできる場所に置いといて、ダウンロードして適当な場所に配置してクラスパスに追加してね、という形にしていた。
この場合、ソースファイルも公開したいけど、どうするのがいいか。(ちなみに、GitHubなんて無かった時代の話ね)
別アーカイブにして一緒にダウンロードしてもらうのが無難そうだけど、別々にダウンロードして解凍するのは面倒だし、Eclipseだと、ソースの添付を別途行う必要がある。
jarファイル内にソースファイルも入れてしまうという方法もあるけど、ソースを見ない(実行用のバイナリーだけあればよい)場合、無駄な容量をとってしまうことになる。

で、Embulkの場合。
RubyGemsという配布用サイトに登録しておけば、gemのインストールという統一的な方法でダウンロードできる。
インストール方法も簡単だし、RubyGemsは審査も特に無いので、非常にお手軽w

AsakusaFWの場合、Mavenのリポジトリーを使っている。
公式リポジトリーのサイトに入れてもらうには審査があるような気がするけど、GitHub Pages辺りで個人的なリポジトリーを公開することは出来る。
そうしておけば、あとは使う側(build.gradle)にリポジトリーのURLとライブラリー名を記述するだけで、jarファイルが(あればソースのアーカイブも)ダウンロードされ、クラスパスに入れてくれるのは、非常に簡単でありがたい。

基本的に自分は保守的(面倒くさいので新しいことをやりたがらない)なんだけど、便利なものには移行するよ(笑)