くりーむわーかー

プログラムとか。作ってて ・試しててハマった事など。誰かのお役に立てば幸いかと。 その他、いろいろエトセトラ。。。

その他もろもろ

早すぎる最適化 Computer Programming as an Art

クヌースさんのチューリング賞受賞時のスピーチ?

「早すぎる最適化は諸悪の根源」ってクヌースさんの割と有名な格言?みたいなものがある。

原本読むと、別にここだけが大事な話じゃないよね?って思ったのと、

色々思ったので残しておこう。

原本


最適化ってそこそこ広い意味があるように思う。

クラス構造を整理するのも最適化って言ったりするし、、、

クヌースさんが言うところだと、パフォーマンスとかメモリ効率の

チューニング的な意味だと思う。

で、そういう対応するためのコードってかなり複雑な処理になりがち。

「このメソッドの中でインスタンス化してるの無駄が多いかな~」

とか

「ここはこういう使われ方をする”かも”しれないからこうしておこう」

みたいな。

そういうことを初期の段階から考えるべきじゃないよって感じ?

最初から完璧な状態を作ろうとするんじゃなくて、変更とかテストが簡単に出来るように、

今この時点での要件を満たすようにコードを書くようにする みたいな。

必要なコトを必要な時に必要な分だけやる みたいな。

完璧なモノは最初から作れないんだから、変更しやすいように組んだ方が良いよね。

で、「ここは遅くなるかなー」って思ってたところでも、

実際にはたいして全体には影響がほとんどないでしょ。って事がよくある。

そういう推測だけでのあーだこーだには対して意味がないから、

作った後に、解析用のツールとか使ってどこにボトルネックがいるかを

ちゃんと実測してから性能的なチューニングをしようねと。

「推測より実測」が大原則だよねと。

っていう話だと思うのですが、そーはいっても、ある程度の性能的な観点は

最初っからやっといた方がよいと思う。

例えば、ループの中でSQL毎回発行して、画面開くたびに100回クエリ発行してるとか

ほったらかしにしてると、結構よく出てきません?

このくらいの意識は持った方が良いとは思う。

で、早すぎる最適化はそんな感じなんだけど、原本読んでみると、

それよりもぐっと来たのがあったのでそっちを書いておきたい。

『誰もが「最良の」スタイルは存在しないことを覚えておくことが最も重要です。』

つまりは、

『芸術は分かんないけど、これが好きなのはわかる』

って事。

コーディングのスタイルってたまに聞くけど、

良いスタイルとは何だろう、悪いスタイルは何だろう。

他の人が作った作品について厳しく批判するべきじゃないでしょう。

みんな自分の好みがあるからね。

他人の好みを「変革」するために自分の「偏見」を押し付けると、

良かれと思って指摘しててもそれはその人の好みを無意識に否定しちゃう。

それって楽しくないよね。

その人は自分が美しいと感じモノをその人なりに作ってるんですよ。

そう感じたものが他の人からも有用だと思って貰えたならそれは素晴らしい事だよね。

創造性の余地を残したい。

何かこう、色々見てると、あーしなきゃだめ。こう書いたらダメ。

こう書いてるやつは分かってないとか、デザインパターンが~、とかとか。

プログラミングは確かに型にはめるとすごく楽だし、

多分きっと、生産性も品質も良くはなるんでしょう。

でも、つまんなくね?

その型を考えた人は楽しいかもしれないけど、

やらされてる方は、毎回毎回同じ感じのコード書くだけになるので

はっきりいって苦痛。

こういう統制がとれた美しさみたいなものもあるでしょうし、

そこが美しいと感じる人もいるでしょう。

でも、つまんなくね?

って、自分もそういう枠組みを考える側なのですが、

どうにかして、実際に作ってる人、個々人の創造性みたいなものを

出せるような感じにしたいのです。

ただ単に自由にさせるだけじゃもちろんダメなんですけど、、、製品としてはね。

確かに、ある側面では明らかにダメな実装っていうのは一杯あると思いますが、

それを書いた人が、何でそう書いたのか、それが何でいいと思ったのかは

ちゃんと聞いてみないとですよね。。。

まーでも、コピペでしかPG書いたこと無いような人も結構いるし、

創造性を出せるようにーとか自分が鼻息荒くしたところで、って感じもする。

プログラム作る事を楽しんでないとやっぱダメよね。

「we ought to give the programmer-user a chance to direct his creativity into useful channels.」

プログラマーが自分の創造性を有用なチャンネルに向ける機会を作りましょう。

CentOS8をVirtualBoxでインスト、ついでにMariaDBとRedis

CentOS8が出てたので、VirtualBoxでとりあえずインスト。

centos8のisoをDL

現時点で「CentOS-8-x86_64-1905-dvd1.iso」

VirtualBoxで適当に作成。

新規作成で枠を作ってから、設定でストレージ⇒コントローラ:IDE⇒CDマーク押してDLしたISOを選択してから起動。

インストールの流れはCentOS7と変わらずかな?

ソフトの選択でサーバGUI選ぶのかワークステーション選ぶのか迷うくらい?

そーいえば、.netCoreの開発みたいなアドオンが出てた。あとで試してみよ。

そしたら色々更新。

dnf -y update
dnf -y install epel-release
dnf -y groupinstall "Development Tools"
dnf -y install dkms bzip2 gcc make kernel-devel kernel-headers

CentOS8からyum ⇒ dnfに変わったらしい。

「yum install」でも動くんだけど、dnfへのリンクになってるだけなんだってさ。

で、GuestAddtionのインストールをするのですが、

前はデバイス⇒GustAddtion選んでたと思うのですが、やってみるとエラー。

何でかなと思ったらどうも既にCDが入ってる事になってるらしい。

なので、アクティビティ⇒ファイルでVBox_Guest~~みたいなのがあるので選択してソフトウェアの実行すればOK。

割とハマらずにウィンドのリサイズとかクリップボードの共有とかできるようになってる。

よかたよかた。

ほいで、CentOS8はPython3がデフォになってるそうで。

でもコマンドが「python3」みたいなので、うーん。

いつも通り仮想環境作るか。。。

そしたら色々触ってみましょかね。。。

ひとまず、MariaDBとRedisをインストする。

MariaDB

MariaDBなんだけど普通にやるとまだCentOS8に対応してないよーって出る。

なので↓。

# dnf localinstallで必要なrpmをもってくる
curl -O https://downloads.mariadb.com/MariaDB/mariadb-10.4.8/yum/centos/mariadb-10.4.8-rhel-8-x86_64-rpms.tar

# 解凍
tar xvf mariadb-10.4.8-rhel-8-x86_64-rpms.tar

# 解凍先に移動
cd mariadb-10.4.8-rhel-8-x86_64-rpms

# インストール
sudo dnf localinstall -y galera-4-26.4.2-1.rhel8.0.el8.x86_64.rpm MariaDB-client-10.4.8-1.el8.x86_64.rpm MariaDB-common-10.4.8-1.el8.x86_64.rpm MariaDB-server-10.4.8-1.el8.x86_64.rpm MariaDB-shared-10.4.8-1.el8.x86_64.rpm

# サービスの有効化と起動
sudo systemctl enable mariadb
sudo systemctl start mariadb

# rootのパスワードとかの設定(最初にパスワード聞かれるけど、空のままエンター)
sudo mysql_secure_installation

#いちを再起動
sudo systemctl restart mariadb

MariaDBは10.4.8じゃないとCentOS8で動かせない様子。

新しい分には別に良いか。。。

Redis

Redisは何か楽になった。

Redis5.0っぽい(2019/11/2)

# インストはこれだけでイケた
sudo dnf install -y redis

# サービスの有効化と起動
sudo systemctl enable redis
sudo systemctl start redis

# 動作確認
redis-cli

# ↑のクライアント上で↓打って PONGって出てくればOK
ping

# いったん抜ける
exit

# ちょろっと設定
sudo vi /etc/redis.conf 

bind 127.0.0.1
↓
bind 0.0.0.0

requirepass  <パスワードを入れる>

# 再起動
sudo systemctl restart redis

# もう一回クライアント
redis-cli

# pingでこんどは「(error) NOAUTH Authentication required.」って出ればOK
ping

# そしたらログイン
auth <上で指定したpassword>

# もっかいpingで、PONGって出ればOK
ping

両方ともインストールはなんか楽になりましたね。。。

「Computer Programming as an Art」機械翻訳

クヌースのチューリング賞受賞時の講演の論文?

日本語訳が見つからなかったので、とりあえず適当にGoogle翻訳でつけた。

メモ用に挙げとく。後で校正する。

訳付き

原本

.net MVCで「roslyn\csc.exe」のエラー

最近、どこからか.netMVCをCloneしてビルドすると↓のエラーが出た。

'bin\roslyn\csc.exe' パスの一部が見つかりませんでした

で、これが出たら↓

パッケージマネージャコンソール(ツール⇒Nugetあたり)

update-package Microsoft.CodeDom.Providers.DotNetCompilerPlatform -r

csc自体はc#のコンパイラだったと思うんだけど、これが見つからないってこと?

ちょっとなぞ。

むかーしむかし、IEのDLLホスティングっていうのがありまして、

そん時に確か、何かのDLL使おうとした時にcsc.exeがねーってエラーが出た記憶があるなー。

だから何だって話ですけど。

参考サイト↓

https://kotaeta.com/62165347

禅とプログラミング

最近Python触ってるんですが、

Pythonには「The Zen of Python」っていう設計思想みたいなものがある。

で、禅って割とシステムとか作ってる人に受けがいいのかなーと思った。

スティーブ・ジョブスなんかも禅が好きだったらしいですよね。

Googleも社内研修みたいなのに、禅の瞑想入門講座みたいなのがあって結構人気があるとか。

エンジニアじゃないけど、イチローも禅が好きみたいな話は聞いたことある。

で、禅って何のかなーって考えてみた。

スティーブ・ジョブズの禅の話とかはコノのサイトにちょっと書いてある。

で、その中で、

「彼はマーケティングを一切しなかった。座禅によって自分の中に下りていき、自分が本当に望むものを徹底的に見ようとした。自分の深いところから来るものを作るから、製品は相手の深いところを揺さぶる力を持っていた。自分は一体何を望むのか。それを探るのが彼の究極のマーケティング・リサーチだったのでしょう」

ジョブズが2005年に米スタンフォード大学の卒業式で行った有名な演説がある。「私は毎朝、鏡の中の自分に向かって、『今日が人生最後の日だったとしたら、今日の予定をやりたいと思うだろうか』と問いかける。『ノー』の日が続いたら、何かを変えなければいけない」

「自分に日々問いかけ、その時に本当にしたいことをしなければいけないと言っている。普通はそう思ってもなかなかできない。だって空気を読んで、皆に好かれる生き方をした方が楽だから。しかし、ジョブズは違った。深く下りていき、普段のモノの見方とは違う、もう一つの視点をキープしようとした。そのために坐禅を使ったのでしょう」

という事らしい。。。

仏教的には悟りの体験って事なんでしょうか。

wikiを引用すると↓。

悟りというものは自分の心で自分の心を確認し、自分の心で自分の心を理解するものである。他人に頼って何かを明らかにするとか、自分以外の何かを利用して体得するようなものではない。

悟るためには何よりもまず坐禅の実践によって自分自身と向き合うことが肝要である。

自分の中にあるものを見つめ直す的な。

で、何かを得ようとするんじゃなくて、要らないものを捨てていって、

最後まで残ってるものが大事なコトみたいに考えるのかしら。

Simple is Bestっていうしね。

考えてみるとクラス設計みたいな事にも通ずるものがあるのかなーと。

例えばオブジェクト指向でいうと継承。

継承って、良くある説明だと「犬⇒哺乳類⇒動物」みたいな。

で、親クラスの性質を引き継ぐみたいな感じじゃない?

じゃー犬の性質、動物の性質ってなんなんでしょ?

その概念に必要な性質ってなんだろうか。って事を考える必要があるわけで。

概念を構成するもの、概念に共通しているコトなんかを考えないといけないよね。

そういうものを考えるアプローチとして例えば、

「is-a」、「has-a」っていう関係性を考えるってものがあるじゃない。

is-aは分類的な思考、has-aは分割的な思考ですよね。

分類できるって事は何かしらの共通項があるって事。

継承を考える時はそういう概念的な共通項を見出して、

この概念であるにはこうなってなきゃいけない的にプログラムを構成すると思うのです。

この共通項を見出すって事が、いわゆる本質を探るって事なんでしょう。きっと。

で、共通項を探るためには、不要な要素は全部そぎ落としていって、

最後に残っていったものが共通項みたいな見方もできるじゃない。

なので、禅にも通ずるのかなーなんて思った訳です。

他には、禅はある意味で自分本位の考え方かなと。

他の人がどう考えてるとか、ユーザのニーズがーとかそういう事じゃなくて、

自分がしたい事、思ってる事は何のかってコトを突き詰めていく感じ。

そういう精神性が例えば、The Zen of Pythonなんかだと、

Now is better than never.

やらないよりは今やれ

COBOL作ったホッパーさんが言うところの

It's easier to ask forgiveness than it is to get permission.

許可を得るよりも許しを求める方が簡単です。

って事なんだろうなーと思った次第です。

で、「ニーズに応える」よりも「ニーズを作り出す」っていう事の方が、

インパクトとしてはデカいと思うんですよ。

「ニーズを作り出す」には周りをうかがってても出てこないんじゃないかなと。

自分がしたいと思った事をやってみることで「ニーズが生まれる」じゃないかと思った次第。

もちろん、自分がしたいと思った事が他の人のニーズになる事はきっと稀でしょう。

上手くはまったのが、スティーブ・ジョブズなんだろうなと。

で、自分のやりたい事をやるのが良いんだ、みたいな論調に記事の中とかでは

言ってたりすると思うんですが、多分それは禅ではないよね。

そういう記事に書かれてる事、スティーブ・ジョブズがやってた事、

そういうのを意識した時点で禅じゃないんだろうなと。

あくまでも自分の中で生まれたものが禅なんでしょう。

ジョブズみたいに、やりたい事をやった結果でニーズを生みだす人もいれば、

そういうニーズに応える事にやりがいを感じる人もいるでしょうし。

その人によりけりですよね。やっぱ。

こういう人それぞれの自分の中で大事なコトっていうを尊重してくのが

禅であって、多様性みたいな事なんだろうなと思った次第です。

CentOS + VirtualBoxでブラックスクリーン

VirtualBoxでCentOS動かしてる時に、

OSの起動ステータスが終わってGUIに切り替わる瞬間に

たまにブラックスクリーンになる。

電源落として何回か上げなおしてみても治らない時の対処。

この症状の場合はOSの起動までは出来てて、GUIの起動でこけてる時。

なので、ブラックスクリーンになったら、

「ctrl + alt + F2」を押す。

それでコンソールになるので、コンソールでログインする。

ログインしたら、「startx」。

で、GUIが起動すると思うので、起動したら再起動する。

※デスクトップのディレクトリ名を英語にするか?みたいなのが出るけどしないにしておく。

これでだいたい治る。何かに引っかかってるんだろうか。

いまいち原因が分からない。

いちを、「/var/log/Xorg.0.log」にGUI起動時のログは出てるんだけど

正常時となんか変わってないような気がする。

そもそも、毎回「vboxvideo」みたいなモジュールがねーってエラーが出てるっぽいんだけど、

ちょっと良く分からないですね。。。

Pythonの今やれ論

Pythonで「import this」ってやると設計思想(The Zen of Python)みたいなものが出るのは有名な話。

その中で「Now is better than never.」っていうのがある。

「やらないよりは今やれ」って話。

まーよく言われるコトなんですが、

ふと思い出してみると、COBOL作ったホッパーさんも同じコト言ってるなーと。

「It's easier to ask forgiveness than it is to get permission.」

「許可を得るよりも許しを求める方が簡単です。」

とりあえずやってみて、うまくいかなかったら謝ればいいじゃん的な。

PythonのThe Zen of Pythonの方はコード的な説明がされてたりもするけど、

これってPythonを開発してる人向けなモノの気がするので、

どっちかっていうと、「とりあえずやってみて反応を見るっていうのも有りだよ」って話だと思ってる。

会社で仕事してると、どうしても周りとか上司にお伺い立ててちゃう感じに

刷り込まれるのでホウレンソウとかさ。

まー組織としてはそれが健全なのかもしれないけど、

新しいモノみたいなのはそれだと出にくいよね。やっぱ。

で、管理職系の人らって「アイディアをー」とか「新規事業~」なんかが

やたら好きでわーわー言うのに、「え?アンタは何してんの(してきたの)?」って

感じの人ばっかなので、なんだかな~って。。。

周りは気にせず色々やりましょうって話にしかなんないけど、色々難しいよね。

あと、Pythonの方はこれに続くのがあって、

「Although never is often better than *right* now.」

「でも、今"すぐ"にやるよりはやらないほうがマシなことが多い。」

一言に「とりあえずやってみる」って言っても、考えなしにただやればいいってもんじゃないよね。

修正をしやすくしてみたり、色々吟味は必要でしょう。

その辺の折り合いは結構難しいですね。。。

dockerのインスト centos

端末変えた時くらいしかしないのですぐ忘れる。メモ。

基本は公式のコマンドをなぞってくだけ。

頭を使う必要はない。

Docker 公式

で、root以外で動かしたいときは下が必要。まぁ、これも公式には書いてあるけども。

# なんか昔dockerのグループ出来なかったことがあったので、いちを↓で保険
sudo groupadd docker

# 今ログインしてるユーザにdockerのグループをつける
sudo gpasswd -a $USER docker

そしたら、「端末」を再起動する。

ログアウト⇒ログインでもいいかもだけど、

再起動した方が確実かな。これがハマる。

GitLabとRedmineの連携

別サーバで社内に立ててるGitLabとRedmineを連携したくなった。

ちなみに片一方はAWSでもう一方はAzure。

GitLabへのPush通知をRedmine側に出して、RedmineからGitLabのリポジトリをpullして

Redmine側のリポジトリに反映させるみたいなやつ。

やるときの流れ。

  1. Redmineに「redmine_github_hook」のプラグインをインストール
  2. Redmineのサーバで適当な場所に該当リポジトリをbareでClone
  3. Redmineでパスワード無しでfetch出来るようにする
  4. Redmineのリポジトリに上でCloneしたフルパスを設定する
  5. GitLabのWebhookを設定する

redmine_github_hookのインストール

https://github.com/koppen/redmine_github_hook

redimne/htdocs/Gemfileの一番最後に↓を記載してbundle

gem "redmine_github_hook"

あと再起動。

リポジトリをbareでClone

こんな感じ

git clone --bare https://gitlab.hoge.com/fuga/myrepo.git myrepo.git

ベアリポジトリのディレクトリ名は「***.git」にした方がいいらしい。

パスワード無しでfetch出来るようにする

sshが通る場合はそれで。

通らない場合はhttpsでcloneすると思いますが、

パスワードキャッシュだとうまくいかなかった。

configにID/PASS書かないとだめっぽ。微妙ーーーー。

myrepo.git/config

[remote "origin"]
	url = https://[userid]:[password]@gitlab.hoge.com/fuga/myrepo.git

Redmineのリポジトリの設定

これは普通に。。。

GitLabのWebhookを設定する

GitLab側は該当リポジトリの「設定⇒インテグレーション」の

WebHookで下の感じのURLを設定してPushにチェックつけて追加。

https://hoge.com/redmine/github_hook?project_id=[プロジェクトの識別子]&repository_id=[リポジトリの識別子]

こんな感じ
https://hoge.com/redmine/github_hook?project_id=myproject&repository_id=myrepo

とりあえずこれで通った。

上手くいかない場合の調べ方。

まずはとりあえず、サーバ間の疎通が取れてるか確認。pingでも何でもいい。

そしたらGitLabに設定したWebHookの編集のリンク。

TestクリックしてPushを選択。

そうすると通知履歴が出来るので、それの編集をクリック。

そしたらResponseが見れるので、一番下にエラーの内容が返ってきてるはず。

Redmine側のログは「log\production.log」あたり。

apacheならPostリクエストのログがapacheのログにも出てるはず。

そのあたり見て、問題の切り分けをするしかなかね。

とりあえず、bareリポジトリじゃないとfetch後のマージとか失敗してるみたいですよ。

最近のプログラミング言語 流行り廃り(StackOverFlowのアンケート)

Googleトレンドで遊んでて、最近の言語はどんな感じなのかなって見てた。だいぶ偏見によった検索ワードですが、下記。

sample01

意外だったのがPythonがJava抜いてるじゃんってとこ。ついにJavaも終焉か・・・って事にはならないと思いますが、私的にはJavaは10年後にレガシーとか言われてそうな気がしている。

昔はPythonとかニッチ(死語?)な言語だと思ってましたが、割と来てるんだね。

最近どうなのか気になったので、StackOverFlowのアンケート結果(2018)を確認してみた。

アンケートの前提

回答:100,000人

地域的なとこ↓

sample02

インドとアメリカとヨーロッパが多そう?

仕事柄↓

03

フロントエンド・バックエンド・フルスタックがほとんどだけど、正直SEなんて、よっぽど特化してなければ、ほぼ3つのどれかにあてはまるよね。。。

あと、回答者のうち半分くらいは5年未満の経験者(仕事として)って事みたい。

若めの回答者が多いっていう認識でよろしいのかな?

良く使う言語

04

良く使うフレームワーク

05

JavaScriptを一番使うらしい。まー、今はほぼWeb系でしょうし。フロントエンドの人はそうなるでしょうね。フレームワークもJavaScript寄りのものが順当に上位。

個人的には.net Coreが割と上位に来てて意外だった。Spring抜いてんだね。C#好きとしてはなんかうれしい。VS2003あたりの.net(正確にはVisualStudio)はクソだと思ったけど、2008あたりから急激に良くなりましたよね。MSがOSSに寄ってきた感じがちょっとした。

まー、C#はVisualStudioありきの言語なのは否めませんが、それでも気持ちよく書けるのが素晴らしいと思う。半分はVSが良いって感じかもかも。

あと、Pythonもやっぱ来てるんだね。ほぼ機械学習・AI・データマイニング絡みだと思いますが、Pythonも書きやすくて好き。

今後数年はPythonとC#がバックエンド的には来るのかしらね。フロントエンドはJavaScript一択でしょうけど。

使ってるDB

06

あれ、SQLServerって上位なん?Oracleってどうしたの?MariaDBには頑張ってほしい。期待上げ。PostgreSQLも上位にあがってるのね。つか、DBランキングとちょっと違う感じがする。↓DBランキング。

07

Oracleって実際どうなんでしょうね。あと、MongoDBはジワジワ来てますな。何系で使われてるんだろ。業務システムって基本RDB使うと思うから、Webサービス的なやつで使ってんのかしら?スキーマレスなDBは業務システム的なデータ構造でガチガチのシステムは微妙な気がするしの。検索のパフォーマンスとかもろもろ。IDで抜くとかだけならMongoの方がパフォーマンスは良さそうなのかしら。いちをNo検証でイメージだけで書いてますので。。。

必要な言語

08

Python大人気すな。AI・機械学習まわりでしょうけども。3年後にはどうなっているかしらね。

使ってるIDE

09

VisualStudioCodeつよ。とゆーか自分もVSCode使ってますね。何か、軽くて使い勝手がよい。ただ、2年前かな?もっと前?に出たばっかで細かいツールというかプラグインが揃いきってないかもかも。でも十分。

所感

やっとJavaは終わったね。.netには頑張ってほしい。C#好き。

で、Pythonがひとまず伸びそうな感じ?今使ってる最中だから人が増えて便利なライブラリとかツールとか増えるとうれしい。まー自分で作れって話ですけど。

意外にもDBはMongoDBが来てるのね。多少は来ると思ってたけど、こんなに来てるとは思ってなかった。Webサービス的なシステムには向いてるのかな。業務システムではちょっと厳しそうな気がする。とりあえずロックが割とゆるかった記憶が。。。

まー、日本で仕事してる身としては、そもそもアンケートに日本からの回答があまり入ってないので世界的にはそんな感じかーという程度。日本てガラパゴスってよく言われるじゃない。世界的な基準のアンケートだと身の回りには割と当てはまらなかったりするしね。

参考サイト

https://insights.stackoverflow.com/survey/2018/

https://db-engines.com/en/ranking_trend

問合せ