くりーむわーかー

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

2019年07月

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

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

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

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

clocでgitのブランチ間の修正行数とかをカウントする

gitで管理してるリポジトリのコード行数とか色々集計したくなった。

コミットの追加行数とか修正行数は見ればわかるんだけど、

色々集計しようとしたりすると、gitのみだと割と使えない。

なのでclocっていうツールを使ってやる。

って話が割と見るんだけど、結構大変だったのと、clocってgitのリポジトリ集計するとき

だいぶイケてないように思うのでちょっと書いておく。

あ、Windowsでやります。

まず、インストール。現状の最新は1.82。

clocのgithubから

で、ググって出てくるサイトが最初はコッチ

古い方のサイトなので、注意。GitHubのreleaseから取る。

DLしてとりあえず動かそうとすると「unzipが無い」みたいなエラーが出る。

なので、unzipをDL。

unzipの公式

このunzipのインストールが必要ってclocの公式に書いて無いような気がするんだけども。。。

で、clocとunzipともpathを通しておかないとまずいっぽいので、path通す。

そしたら、対象のリポジトリのディレクトリに行って下の感じ。

git rev-list --max-parents=0 HEAD
>> ae5d586ed47385ded893d95c3ac66724e41259c4

cloc --diff ae5d586ed47385ded893d95c3ac66724e41259c4 HEAD

これで集計はされるんですが、割と↓のエラーが出るんでないかと。

fatal: pathspec ''Program.cs'' did not match any files
Failed to create tarfile of files from git. at script/cloc line 4584.

何でこれが出るのか全然分からなくて、ソース見てみたんですが、

gitのリポジトリからやる場合、下記の流れてやってるっぽい。

それぞれのハッシュから変更のあったファイル名を

git ls-tree --name-only

で持ってきて、

git archive

にファイルの一覧を渡してZIPなんかにして、

そのZIPファイルをclocで集計するみたいな動きになってる。

で、どうも比較するハッシュのどっちかに無いファイルがあると、

archiveが失敗してるって事みたい。

ダメじゃん。。。

cloc自体、スター結構ついてるし使ってる人いっぱいいると思うのですが、

どうみてもコレ出来ないんですよ。

どーなんだろ、みんな困ってないのかしら?

cloc自体、生のファイルかZIPとかのアーカイブからじゃないと集計できないって事なのね。

そしたら、自分でgit の zipアーカイブをいい感じに作るしかないですね。

とりあえず、ブランチ間の差分をとるなら下の感じでやれる。

git archive test --output=test.zip

git archive master --output=master.zip

cloc --diff test.zip master.zip

変更されたファイルのみやりたい場合は、なんかスクリプト組むか

プログラム作るしかなさそうですね。。。

C#でちょっと「ほや?」って思った事

大した話じゃないんですが、下記ソース。

public void hoge()
{
    //プリミティブ
    int t = 1;
    int tt = t;
    Console.WriteLine("ref={0}", Object.ReferenceEquals(t, tt));//⇒False
    //オブジェクト
    Object o = new object();
    Object oo = o;
    Console.WriteLine("ref={0}", Object.ReferenceEquals(o, oo));//⇒True
    //string
    string s = "s";
    string ss = s;
    Console.WriteLine("ref={0}", Object.ReferenceEquals(s, ss));//⇒True
    //オブジェクトの中のプリミティブ
    SampleValue x = new SampleValue();
    SampleValue xx = x;
    Console.WriteLine("ref={0}", Object.ReferenceEquals(x, xx));//⇒True
    Console.WriteLine("ref={0}", Object.ReferenceEquals(x.v, xx.v));//⇒False!!!
}
public class SampleValue
{
    public int v = 1;
}

オブジェクトは参照渡しだから、ReferenceEqualsがTrueになるのは分かるんだけど、

中のプリミティブな奴ってFalseになるんですね。

そうなのかーーーと思って。

なんか、すんませんでした。。。

問合せ