くりーむわーかー

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

その他もろもろ

「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

MariaDB rootのパスワードの話 再設定とか

最近?のMariaDBはインストールした後にセキュアインストールっていうのがある。

ルートのパスワード設定とか対話形式でやってくれるので、ありがたや。rootのパスワード再設定とかもしてくれる。rootの再設定って昔はセーフモードで上げて~、あれこれのテーブルを直でUpdateして~みたいな感じだったので、コレできるとだいぶありがたや。

インストール後に↓

#~~インストール

#終わったらサービス上げる
sudo systemctl start mariadb

#↓のコマンド
sudo '/usr/bin/mysql_secure_installation'

#そしたら対話形式に色々効いてくるので答えてくだけ
#最初に現在のルートのパスワード聞いてくるけど
#本当に初回は空欄(エンターのみ)でOK

Enter current password for root (enter for none): 

#本当に初回は↓
Set root password? [Y/n] y
#2回目以降は↓
Change the root password? [Y/n] y

New password: 
Re-enter new password: 

Remove anonymous users? [Y/n] n
Disallow root login remotely? [Y/n] n
Remove test database and access to it? [Y/n] n
Reload privilege tables now? [Y/n] n

パスワード以外の質問は自分は基本nでやってる。ローカルで試してる程度だったら、特に消す必要もないので。

昔のやり方より断然こっちの方が楽でよい。

SeleniumとCypress

UIテストするのにSeleniumCypress(サイプレス)が最近のはやりの模様。

Seleniumを使うことにしたんですが、以下理由。

Cypressはセットアップが楽っていう評判なんだけど、Seleniumも別に大変じゃなかった。自分はChrome上で使う前提。スクリプトの言語はPythonで。

・Cypress==================================
#インスト
cd /your/project/path
npm install cypress --save-dev
#実行
./node_modules/.bin/cypress open

・Selenium==================================
#①Chromeのインスト
vi /etc/yum.repos.d/google-chrome.repo
 
#↑の中身
[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/x86_64
enabled=1
gpgcheck=1
gpgkey=https://dl.google.com/linux/linux_signing_key.pub

#libOSMesa は CentOS7 でクラッシュする問題に対応するために入れた方がいいらしい。
yum -y install google-chrome-stable libOSMesa

#確認
google-chrome --version

#②ChromeDriverとフォントのインストール
yum -y install libX11 GConf2 fontconfig

#ChromeDriver持ってくる
#https://sites.google.com/a/chromium.org/chromedriver/downloadsのLastReleaseページ
wget https://chromedriver.storage.googleapis.com/2.41/chromedriver_linux64.zip
unzip chromedriver_linux64.zip
mv chromedriver /usr/local/bin/

# IPA Fonts のインストール
yum -y install ipa-gothic-fonts ipa-mincho-fonts ipa-pgothic-fonts ipa-pmincho-fonts
fc-cache -fv


#③Python3.6環境でseleniumのインスト
#仮想環境作る
python3.6 -m venv selenv
#仮想環境に切り替え
source bin/activate
#seleniumのインスト
pip install selenium

もちろんCypressの方が圧倒的に楽なんだけど、Seleniumも言うほど大変でもない。

Cypress使ってみて思ったのはスクリプト書くのが結構つらい。最初、Cypressのツール上でスクリプト書けるのかと思ってたんだけど、「好きなIDEでスクリプト書いてね♪」って公式に書いてあった。んーせめて、ページの要素のIDとかをコピペ出来たりみたいなサポートツール的なサムシングエルスが欲しい。相当ページの内容把握してないとサラサラとはかけなさそう。

その他、いくつか制約もあるみたいなのでちょっと微妙な気がする。性能が良いっていうのも見たけど、両方使ってみていまのとこ大差ないと思う。更新一杯するような複雑なスクリプト書くと違うんだろうか。

Cypressはまだまだ発展途上的な感じがする。インターフェースとかは好き。今後に期待。スクリプトを書くのがもっと楽になればいい感じになりそう。てかもうあるのかな?探してみた感じだとなさそうなんだけども。。。

SeleniumはKatalon RecorderをChrome拡張で入れれば、Chromeの操作記録をそのままPythonスクリプトに出来るのでかなり楽。ただ、スクリプトの中身、DOMの指定するとことかが正直微妙?

拡張性というかコードの保守していくとすぐ動かなくなりそう。そのまま使うのは無理っぽい。ただ、指定の仕方を変えればいいだけなので、1から書くよりは十分効率的かな。

スクリプト変える部分は例えば↓の感じ。

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
from selenium.webdriver.chrome.options import Options#ここが必要
import unittest, time, re

class UntitledTestCase(unittest.TestCase):
    def setUp(self):
        #↓ここ
        options = Options()
        options.add_argument('--headless')
        options.add_argument('--no-sandbox')
        options.add_argument('--disable-gpu')
        options.add_argument('--window-size=1280,1024')
        #↑ここ
        #self.driver = webdriver.Firefox()#ここを↓の行にする
        self.driver = webdriver.Chrome(chrome_options=options)#ここ

        self.driver.implicitly_wait(30)
        self.base_url = "https://www.katalon.com/"
        self.verificationErrors = []
        self.accept_next_alert = True
    
    def test_untitled_test_case(self):
        driver = self.driver
        driver.get("http://hoge.fuga.com/moe/")
        driver.save_screenshot('screenshot01.png')
        driver.find_element_by_link_text("Wiki").click()
        driver.save_screenshot('screenshot01.png')
    
    def is_element_present(self, how, what):
        try: self.driver.find_element(by=how, value=what)
        except NoSuchElementException as e: return False
        return True
    
    def is_alert_present(self):
        try: self.driver.switch_to_alert()
        except NoAlertPresentException as e: return False
        return True
    
    def close_alert_and_get_its_text(self):
        try:
            alert = self.driver.switch_to_alert()
            alert_text = alert.text
            if self.accept_next_alert:
                alert.accept()
            else:
                alert.dismiss()
            return alert_text
        finally: self.accept_next_alert = True
    
    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
    unittest.main()


===========================
実行は「python hoge.py」みたいな感じ。
問合せ