Aikの技術日記

技術的な進捗とか成果とかを細々と投稿するブログです。時々雑記も。

久しぶりにMacOSを起動してやったこと

はじめに

こんにちは、筆者です。
※ここからしばらく無関係な雑談が続きます、本編を見たい方はこちらからどうぞ

最近はコロナウイルスの影響や夏真っ盛りということで、引きこもり生活が続いています。
会社がテレワークになかなか踏み切らないので出社時は外出するんですが

引きこもり生活が長く続くと、ゲームやらPCゲームやらiPadでのお絵かきやらをついついしちゃい、気づけば8月。
そろそろ業務以外にもソースコードを書きたいなと思い(具体的にはVue3を試してみたいなと思い)Macbookを取り出したのですが…。

数ヶ月単位で起動してなかったからか、OSは古いわソフトウェアアップデートの嵐だわで散々な状態に。
いろんなアップデートを済ませようやくコードが書ける…と思い、vue --versionを叩いたら今度はvue: command not found.というエラーに見舞われ…。

どうやらnpmモジュールやらHomebrewやらが新しくなってなかったせいでエラーが起こっていたようで。
App Store等を経由してアップデート可能なソフトウェアと異なり、これらのパッケージ群はエラー吐かれないと中々気づけないんだなぁと思う次第です。

おまけにいつからか(Catalinaから)、MacOSのデフォルトターミナルがbashからzshに変わっているという。
((流石にこれは気付けよって話ですが

こんな状況下になり、この記事この記事以来久々にMacOSを結構いじったので、折角だしとどんなことをやったかメモしておこうかと。

それではいきましょう。

どんなことをやったか

まずはどんなことをやったかを箇条書きで。

  • Homebrewのアップデート
  • グローバルインストールされたnpmパッケージのアップデート
  • zshのカスタマイズ

順に見ていきましょう。

Homebrewのアップデート

久しぶりに起動したので、まずはHomebrew自体のアップデートから。

$ brew update

次にHomebrewでインストールしたPKGのアップデートをしたのですが…。

brew upgrade

XCodeのアップデートが先に終わってなかったからなのか、brew install gccあたりでつまづくはめに。
XCodeって普段全然使ってなかったので、アップデートを年単位で放置していたのですが…こういうところで使ってたんですね。

こちらの記事を参考にしながら、xcode-select --installを叩きPC再起動を繰り返して何とか治りました…。
macOSでgccが入らない - Qiita

また、plantumlのアップデートでもえらくコケました。
どうもplantumlは依存モジュールが多いらしく…依存モジュールのアップデートでこけてるっぽかったです。

また、元々インストールしていたパッケージのいくつか(libksbaとか)は、MacOSに標準で搭載されるようになった様子。
Homebrewでインストールする必要が無くなったってことですね…。

どうしてもHomebrew経由でインストールしたい場合は、特別な手順を踏まないといけないようで。
筆者的にはそこまでする必要もないので、放置しておきました。

一通りアップデートされても何だか不安だったので、数回brew updatebrew upgradeを実行。
何も動作しなくなるまで叩き続けました…。

ちなみに現状でインストールされているHomebrewパッケージの一覧はこちら。
殆どが聞き覚えのないパッケージです…何かの依存先パッケージなのでしょう。
((brewbrewnと思い切りミスってるのは気にしないでください…

$ brewn list
zsh: correct brewn to brew [nyae]? y
autoconf        gibo            imagemagick     libtiff         openjdk         ruby-build
automake        giflib          isl         libtool         openjpeg        shared-mime-info
cairo           git         jasper          libuninameslist     openssl@1.1     sqlite
coreutils       glib            jpeg            libxml2         pango           webp
docbook         gmp         jq          libyaml         pcre            x265
docbook-xsl     gnu-getopt      libde265        little-cms2     pcre2           xmlto
fontconfig      gobject-introspection   libffi          lzo         pixman          xz
fontforge       graphite2       libgpg-error        mono            pkg-config      yarn
freetype        graphviz        libheif         mpfr            plantuml        zlib
fribidi         gts         libksba         netpbm          pyenv           zsh-completions
gcc         harfbuzz        liblqr          nkf         python@2
gd          heroku          libmpc          node            python@3.8
gdbm            heroku-node     libomp          nodebrew        rbenv
gettext         icu4c           libpng          oniguruma       readline
ghostscript     ilmbase         libspiro        openexr         ricty

お次はグローバルインストールされたnpmパッケージのアップデートです。

グローバルインストールされたnpmパッケージのアップデート

Homebrewと同様に、まずはnpm自体のアップデートから。

npm update -g npm

次にグローバルインストールされたnpmパッケージのアップデートを実行。

npm update -g npm

Homebrewの時とは打って変わり、非常にすんなりアップデートできました。
また、Homebrewとは異なりアップデート予定のモジュールがこんな感じに一覧化されるのも嬉しいポイントです。

"アップデートされたnpmモジュール一覧"
こんな感じ

npm outdated -g

最後に何の気なしに、現状インストールされているnpmパッケージ一覧をチェック。
--depth=0を付けないと依存モジュールまで全部出てしんどすぎるのでご注意を(一敗)。

npm ls --depth=0 -g
/Users/**ナイショ**/.node_modules_global/lib
├── @vue/cli@4.5.2
├── azure-cli@0.10.20
├── jshint@2.11.0
├── long@4.0.0
├── moment@2.24.0
├── n@6.2.0
├── node@11.15.0
├── npm@6.14.7
├── request@2.88.0
└── yarn@1.22.4

…ここで、yarnがnpmとHomebrewで両方インストールされていることに気づき。
yarnの様なパッケージ管理モジュールを同一の役割を持つnpmでインストールしてるのは個人的に気持ち悪かったので、ひとまずnpmの方から削除。

npm remove -g yarn
removed 1 package in 0.078s
🌹  ~  yarn -v
1.12.3

yarnが最終的に残っているかも確認取れたので、ひとまずはここまで。
ついでに今使ってないパッケージもいくつか消し、最終的なnpmパッケージ一覧は下記のようになりました。

npm ls --depth=0 -g
/Users/**ナイショ**/.node_modules_global/lib
├── @vue/cli@4.5.2
├── jshint@2.11.0
├── long@4.0.0
├── moment@2.24.0
├── n@6.2.0
├── node@11.15.0
├── npm@6.14.7
└── request@2.88.0

最後にzshのカスタマイズです。

zshのカスタマイズ

MacOS Catalinaからデフォルトターミナルがbashzshになったことを受け、今後はzshを使おうと決心しカスタマイズしていくことに。
これまで筆者はbashを使っていたので、「できることならbashの設定を維持しながらzshをカスタマイズしたいな〜」と思った矢先、素晴らしい記事が。

qiita.com

こちらの記事にある様に、zshの補完機能を強化するzsh-completionを入れたりzshの設定フレームワーク(?)のPreztoを使いながらカスタム。
おまけで~/.zshrc~/.zprofileを下記の様にいじって完成。
以前の記事のニノ鉄は踏まない様、各設定値にはバッチリコメントを入れておきました。

#`~/.zshrc`: 
#入力ミスに対応する
setopt correct
#`~/.zprofile`
# ターミナルの$前に表示される情報の変更
PROMPT='%W %M/%n%$ '

# Customize prompt
autoload -Uz promptinit
promptinit
prompt cloud 🌹

最後に

コードを書きたいと思ってからここまでで、半日くらいかかっちゃいました…Vue3を試してみたかっただけなのになぜここまで…。
でもこれでめでたく、vue cliが使える様になりました!

vue --version
@vue/cli 4.5.2

折角あるんだし、今後は定期的にMacbook使っていこうかなと思う次第です…。
それでは|д゚*)

オープンソースライセンスについてまとめてみた Part1-コピーレフト型編

はじめに

こんにちは、筆者です。

最近お仕事にて、職場内であまりノウハウのない技術(Vue.js)を使用するプロジェクトに携わっており。
そんな中で、ちょっとした動き…スライダー表示や仮想スクロールなんかの「自力開発がめんどい処理」を実現するのにライブラリを探す機会が多くありました。

そんな中で気になったのが「オープンソースライセンス」の存在。
これまでの趣味プログラムと違って製品化するプログラムなので、「使用するライブラリのライセンス」には注意を払いたいところです。

ただ、幸か不幸かこれまで筆者はライブラリを自力で探して活用して…みたいなことを業務で行ったことはなく…ライセンスに関する知識がほぼない状態。
幸いにも、職場内にそういったライセンス周りに詳しい方がいたため難を逃れましたが…。
ライセンスについては、エンジニアとして最低限レベルは知識をつけたい分野だなぁと。

知識をつけるには、調べてまとめるのが一番自分的に身につくので…。
本記事にて、ライセンスに関する知識が載ってる記事をまとめたり、時には自分なりにまとめていきながら見ていこうと思います。

それではいきましょう。

オープンソースライセンスにどんな種類があるのか

まずは「オープンソースライセンスにどんな種類があるのか」から。
オープンソースライセンスは、大まかに分けると下記の3種類に分類されるそうです:

この3つを順に見ていきましょう。

コピーレフト型とは

概要をWikipediaさんからお借りします:

コピーレフト(英: copyleft)は、著作権(英: copyright)に対する考え方で、著作権を保持したまま、二次的著作物も含めて、すべての者が著作物を利用・再配布・改変できなければならないという考え方である。

参考: コピーレフト - Wikipedia

利⽤者にOSSを複写・改変・再頒布する⾃由を与える⼀⽅で、派⽣ソフトウェアを頒布する際は、全く同じ条件で派⽣ソフトウェアを頒布することを義務付けること。
以下の基準によって、大きく3つに分類することができる。
① ソフトウェア利⽤者に対して、利⽤者がソースコードを改変した際に、改変部分のソースの開⽰を義務づけるかどうか
② ソフトウェア利⽤者がソースコードを他のソフトウェアのソースコードと組み合わせた際に、他のソースコードの開⽰を義務づけるかどうか

参考: コピーレフト - Wikipedia

コピーレフト型のライセンスが適用されたソフトウェアは、そのソフトウェアを利用した他のソフトウェアもコピーレフト型のライセンスとなり、ソースコードを公開しないといけなくなっちゃうので…。
製品化を行う上では、このライセンスが適用されたライブラリを使用しちゃうと製品化されたソフトウェアのコードも全て公開しないといけなくなるので注意が必要です。

また、コピーレフト型のライセンスが持つ特性から「ライセンス汚染」というスラングも生まれたそうで。
「汚染」という言葉に、コピーレフト型の考え方に合わない方の想いが伝わる気もします…。

これらの特性から、個人的には先に掲げた3つ「コピーレフト型」「準コピーレフト型」「非コピーレフト型」の中でも最も気をつけなければいけないライセンスかなと思いますが…。
このライセンス…いえ、もっと言うと…。
このライセンスを定義したリチャード・ストールマンさんが創始者フリーソフトウェア運動と言う観点から見れば、このライセンス形態はリチャード・ストールマンさんの理想とした形でもあるのかなと。

また、Wikipedia情報&コピーレフトではなくGPLに関する話題ですが、こんな見解もあるようで:

ストールマンは、ソフトウェアに対する自由とは何かという問題を提起し、そのひとつの答えを提示した。
GPLは、「自由なソフトウェア」を、有償・無償に関係なく、頒布できるようにした、という単純な意味だけでなく、「ソフトウェアは自由であるべき」という思想が存在することを一般に認知させたという意味において極めて重要な意義がある。

GPLにより付与される強力なコピーレフトGNU/Linuxの成功にとって重要な役割を果たしているとも言われる。
なぜなら、コミュニティに全く還元しようとしないソフトウェア企業にただ搾取されるのではなく、著作物が世界全体に貢献し、自由であり続けるという確証をGPLプログラマに与えたからである。

参考: GNU General Public License - Wikipedia

ソフトウェアの自由を守る上では、最も強力なライセンスと言ってもいいかもしれません。

余談ですが、「コピーレフト」の名称の由来は「コピーライト(Copyright)」のもじりから来たものであるそうです。
「コピーライト」が「Copyright — all rights reserved」(著作権―全ての権利は留保されている)」に対し、
コピーレフト」は「Copyleft — all rights reversed」(コピーレフト―全ての権利は逆さにされている)」といった感じに。

このフレーズは「ドン・ホプキンス」という開発者が、コピーレフトの考え方の師リチャード・ストールマンにあてて送ったフレーズであるそうで。
ストールマンさんがこのフレーズを気に入ってそのまま使ったそうな…。

お次はそんなコピーレフト型の特性を持った具体的なライセンスの代表格、GPLについて見ていきましょう。

GNU General Public License(GPL)

GPLは「GNU General Public License」の略称です。
フルネームでこの用語を見かけることはほとんどなく、GPLの名称で呼ばれているのをよく見かける…気がします。

GPLライセンスが許諾する内容は下記の通りとなります:

  • プログラムの実行
  • プログラムの動作を調べ、それを改変すること(ソースコードへのアクセスは、その前提になる)
  • 複製物の再頒布
  • プログラムを改良し、改良を公衆にリリースする権利(ソースコードへのアクセスは、その前提になる)

また、GPL自体も何回か改訂されており、執筆当時(2020/07/24)では「GPL Version1」と「GPL Version2」、「GPL Version3」までが存在します。
ただ、どのバージョンでも基本思想は変わっておりません。
どちらかと言うと、GPLが広まっていく&時代が変わるにつれ、GPLの規定の穴を突く様な使われ方をされたケースがあった or 当初の規定では考慮していなかった要素が出てきた事に対する対抗策として改訂されていった…と言う形ですね。

もっと詳しいことを見たい場合は、下記の記事あたりを参照に。

GNU General Public License - Wikipedia
https://www.ipa.go.jp/files/000028288.pdf
GPL(v3)をApache(v2)と比較する、ためにGPL(v3)の該当部分を読む。 – 弁理士 前渋正治

特にWikipediaさんは結構詳しくまとめられておすすめです。
というかオープンソースライセンス周りについては、執筆当時(2020/07/24)段階のWikipediaさんで結構詳しくまとめられているので…。
GPLに限らずオープンソースライセンスについて知りたい場合は、Wikipediaを見てみるといいかもしれません。

お次は非コピーレフト型をまとめていきたい…ところですが、記事が長くなりそうなので分割する事にします。

おわりに

今回記事では、オープンソースライセンスのコピーレフト型に関してまとめてみました。
本記事でオープンソースライセンスのおおまかな内容と、コピーレフト型については把握できたかなぁと。

次回記事では、非コピーレフト型のオープンソースライセンスにまとめていこうと思います。

余談として、Githubでのライセンスシェア状況をまとめてみました。
何かの参考になれば幸いです。

それでは|д゚*)

余談: Githubでのライセンスシェア状況

こちらの下記記事を参考に、執筆当時でGithubリポジトリ内の「シェア率が最も高いライセンスが何か」をまとめてみました。
GitHubのOSSライセンスシェアの調査結果 - Qiita

集計結果はこんな感じ。

"各ライセンスのリポジトリ数"
各ライセンスのリポジトリ

"各ライセンスのリポジトリ数比率"
各ライセンスのリポジトリ数比率

上位ライセンスを簡単にまとめてみるとこんな感じ。

ライセンス名称 ライセンス数 シェア率
MIT コピーレフト 3898191 40%
GPL 1696639 コピーレフト 18%
Apache-2.0 コピーレフト 1314776 14%
GPL Version3.0 コピーレフト 1297730 13%
GPL Version2.0 コピーレフト 403907 4%

MITライセンスは圧倒的なシェアを誇っていることがわかります。
2番目のGPLライセンスも大したものですが、この中に「伝播してGPLにせざるを得なかった」リポジトリがどれだけあるかはわかりませんがね…。

paiza等をやるのにおすすめ環境まとめ

はじめに

こんにちは、筆者です。
最近になってpaizaやAIZU ONLINE JUDGEのコードを書くのにちょっとはまりだしています。

paiza.jp judge.u-aizu.ac.jp

筆者は基本的に「コードを書く」よりも「モノづくりをする」方が好きなのですが…。
モノづくりには非常に時間も労力もかかりますからね。
その点、paizaやAIZU ONLINE JUDGEは思いついたその日に書いて実行してオワリ!となれるのがとても気楽です。
個人的にはpaizaの方が、ランクも上がるしこなしていく上での達成感が出るので好きだったり…

ただ、意外と大変なのがデバッグ作業。
環境構築やコードの書きやすさから、筆者はRubyを使ってやっているのですが…。

「コードを保存→コンソールを開く→コンソールから該当ディレクトリへ→実行」という作業が非常に億劫で。
何とかこの作業が楽にできないかなと思い、色々調べてみました。

本記事は、その色々調べた内容をまとめたものになります。
それではいきましょう。

調査結果

調べてみた結果、楽に実行するには下記の2通りの方法が使えそうです:

順番に見ていきましょう。

WebIDEを使用

Web上で動作可能なIDEを使用する方法です。
無料で出来るサービスも多く、ブラウザからアクセスするだけで環境が整うので非常にお手軽です。

いろんなサービスがある中で、paiza等をやるにあたっては「paiza.io」が最もやりやすいなと感じました。
paiza.io

※製作ブログはこちら: 24のプログラミング言語がブラウザで即実行できる『paiza.IO』 - paiza開発日誌

対応言語が多い(下記参照)ことと、入力をさっと書ける&出力結果もすぐ見れるのが主要因ですね。

対応言語: C、C++C#JavaRuby、Python2系、Python3系、PHPPerlJavaScriptObjective-CScala、Go、HaskellCoffeeScriptBashErlang、R、COBOLVB、F#、MySQLClojure、Dの24言語に対応
参考記事: 24のプログラミング言語がブラウザで即実行できる『paiza.IO』 - paiza開発日誌

コードの実行のショートカット(Ctrl+Enter)も付いているため、ちょっと書いてさっと実行するサイクルも回しやすいです。
簡単なオートコンプリート機能もついており、サクサクとコードが書けます。

コードの共有機能もついており…。
ちょっとしたコードの共有にも利用できそうです。
((まぁコードの共有に関してなら、もっといいサービスはあるでしょうが…。

筆者もpaiza.ioを使用して問題を解いてみましたが、非常に課題をこなしやすかったです。
paizaの様なオンラインプログラミングコンテスト系のものを行うなら、とてもおすすめだなぁと。

ちょっと脱線しますが…。
paizaの様なコンテンツではなく「Githubリポジトリを直接触りたい!」とかでしたらGitpodがおすすめです。
www.gitpod.io qiita.com

他にも、JavaScriptの実行環境が欲しい場合は下記記事に載っているIDEも良さげです。
特にPLAYCODEはUIも綺麗でおすすめ。
【2017年版】ブラウザ上で使えるJavaScript開発&実行環境Webサービスの厳選まとめ - paiza開発日誌

ただ、今回みたいなさくっとした環境が欲しい程度なら上記のサービスは少し豪華すぎるので…。
やっぱりpaiza.ioの方がいいのかなと思う次第です。

WebIDEの欠点としては「WebIDE側が対応していない言語では出来ない」事でしょうか。
あとは「インターネット環境がないとできない」というのも挙げられるかも。

また「作成したコードがどこかに公開された状態になる」というのも問題かもですね。
例えば…paiza.ioだと、コードを作成した時点でランダムな文字列がくっついた独自のURLが生成されます。

これにより、例えばブラウザを間違えて閉じちゃっても、このURLに飛べば、コードが復元され続きが書ける様になっているっぽいです。
paizaやAIZU ONLINE JUDGEの課題の様な「個人の練習用プログラム」なら全く問題ないですが…。
表にばれちゃまずい内容(Secret KeyとかAccess Tokenとか)を不用意に書くのはよした方がいいかなぁと。

そうでなくとも「自分の書いたコードを誰かに見られる可能性は排除したい!」という場合であれば、後述するVS Code拡張機能を使うのもいいかなと。

VS Code拡張機能を使用

VS Codeで環境構築するなら、Code Runnerという「選択範囲のみを実行してくれる」ツールが便利かなと。
marketplace.visualstudio.com

対応言語は下記の通り。
非常に多くの言語に対応してくれてる上、カスタムコマンドを使えば下記に載っていない言語でも実行できる様になるとか。

C, C++, Java, JavaScript, PHP, Python, Perl, Perl 6, Ruby, Go, Lua, Groovy, PowerShell, BAT/CMD, BASH/SH, F# Script, F# (.NET Core), C# Script, C# (.NET Core), VBScript, TypeScript, CoffeeScript, Scala, Swift, Julia, Crystal, OCaml Script, R, AppleScript, Elixir, Visual Basic .NET, Clojure, Haxe, Objective-C, Rust, Racket, Scheme, AutoHotkey, AutoIt, Kotlin, Dart, Free Pascal, Haskell, Nim, D, Lisp, Kit, V, SCSS, Sass, CUDA, Less
参考記事: Code Runner - Visual Studio Marketplace

こちらの記事に使い方等が分かりやすく載っておりましたので載せておきます:
Visual Studio Codeにてコードを実行することができる拡張機能 | ぶろぐち

ただ、paiza.ioの様な入力処理については対応されていないため…。
入力処理を元に色々行っていく課題で行うには、ちょっと工夫が必要かもですね…。
((コード内部にダミーコードを仕込み、そこで疑似的に値を入れちゃうとか

VS Code拡張機能を使うことで、オフラインでの環境が手に入るので…インターネット環境外でもプログラミングができる様になるのが個人的な推しポイントです。
((拡張機能インストール時はインターネット環境が必要ですが

例えば外出中にふとやりたくなった時に、「スマホで問題を見ながら」PCを立ち上げて問題を解く…といった環境が構築できるかなと。
((まぁ今時はテザリングでなんとかなるのかな…。

もちろん、オフライン環境が整えられるものであればAtomでもSublime Textでも何でもいいですが…。
VS Codeの万能っぷりには負けちゃうかなと思う次第です。

もしVS Codeで実践するなら、併せて自分が使用したい言語のAutocompleteやIntelisense系の拡張機能を入れればもっと爆速にコードが書けるかなと。

欠点としては、VS Codeをはじめとした環境構築にちょっと手間がかかるくらいでしょうか。
とはいえ、VS Codeをインストールし拡張機能のインストール をすればいいだけですが…。
WebIDEはブラウザを開き所定のURLを叩けば完了してしまうので、そのレベルの気軽さと比べるとどうしても見劣りするかなぁと思います…。

おわりに

今回は、paizaやAIZU ONLINE JUDGE等のオンラインプログラミングコンテストをやるにあたっておすすめな環境をまとめてみました。

これら環境は、paizaやAIZU ONLINEJUDGEなどのプログラミングコンテスト系へ挑む時以外にも…。
「不具合対応時に使い捨てのコードを作ることになった時」や「小さな関数を作っている時」等に役に立つかなと思います。
((もし大事なデータを使う場合は、WebIDEはよしておいた方が良さそうですね

それでは|д゚*)