20201215のMacに関する記事は8件です。

モデル作成後に、サーバ起動&アクセス時に「TypyError:'set' object is not reversible」となる場合の確認箇所について(@Python/jango)

はじめに

今回は、Djangoアプリ作成過程で起きたエラーについて触れていこうと思います。

TypyError:'set' object is not reversible

モデル作成を行った後、サーバー起動しアクセスした際に発生しました。

結論としては、入力ミスでしたので内容を確認していきます。

参考記事

エラー詳細

models.pyを編集した後に、
以下のコマンドでサーバ起動しアクセス。

$ python manage.py runserver

スクリーンショット 2020-12-15 23.46.35.png

原因

アプリケーションフォルダ内のurls.pyの記述が以下の通りになっていました。。

urlpatterns = {
    path('', views.index, name='index'),
}

誤:{}

正:[]

まとめ

基礎を確認しながら引き続き頑張ります!

参考にさせていただいた記事の作成者様ありがとうございました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Big Surで文鎮化したMacBook Proを復旧する: How to Fix a Bricked MacBook Pro with Big Sur

まず始めに...


この記事は今年は水没しなかったTokyo City University Advent Calendar 2020の25日目の記事です.
前日はましま氏の友人とともにCNCペンプロッタを作ってみたお話でした.

導入


先日発表されたmacOS Big Surをご存知でしょうか.
このBig Sur, 「MacBook ProのMid2014モデル対応」と謳われていたのですが, アップデートを実施することで起動しなくなる=文鎮化するという報告が多数なされていました.
macOS Big Surアップデート中にMacが文鎮化するトラブルが多発

Macのアップデートで文鎮化はほぼ毎回のように話題に出ているので, 今回も限られた一部の人だけが発症してるんだろう...そう思って意気揚々とBig Surのアップデートを実行したところ

見事に文鎮化しました.

これといった解決策の書かれたサイトも見つからないので, 誰かの参考になれば, ということでクリスマスプレゼント代わりに置いておきます.

概要


実のところAppleもこの問題を認識しているらしく, 公式で対処法を発表しています.
If you can’t install macOS Big Sur on certain 13-inch MacBook Pro computers from 2013 and 2014
それならこの記事必要ないじゃん! と思うかもしれませんが, そうは問屋が卸さないということで...

まずは事態の概要から見ていきましょう.
文鎮化した僕のMacBook Proの詳細を記載しておきます.

モデル:MacBook Pro retina 13" Mid2014
CPU: i5, 2.6 GHz
RAM: 8 GB
SSD: 128 GB
アップデート前OS: macOS 10.15.7 Catalina

今回, 文鎮化報告の多数は13インチのMacBook Pro Late2013, Mid2014に集中しているようなので, 僕の端末も当てはまります.

症状はBig Surアップデート中の再起動後にブラックアウトで文鎮化.
電源を入れるとバックライトは点灯するが画面は暗いまま. 林檎マークも表示されない.
キーコンビネーションは一切効かず, macOS復旧やPRAMリセット等も不可能.
外部モニタへの出力も当然不可.
Catalinaが入っている別のMacのSSDと交換しても起動せず.
といった具合です.

ちなみに上記のAppleの解決方法はキーコンビネーションが使えることが前提であり, それができないのであればAppleサポートに連絡してくれ, となっていますが, Appleに連絡してもロジックボード有償交換がオチでした. しかも生産終了品のため在庫がなければ有償修理すら不可能...

ネットの情報を見ているとどうやらEFIファームウェアの破損が原因らしいのですが, EFIファームウェアの上書きもどうにかして本体を起動しないとどうにもならないわけで...

では万事休すなのかと言えば決してそうではなく, とりあえず結果から書くと

OS 起動可不可 備考
OS X Marvericks~El Capitan 可能 I/Oボードの有無関係無し
macOS 可能 I/Oボードの有無関係無し

となりました.
要するにどうにかなった訳です.

根本的に解決したのかは疑問が残りますが, まぁ起動すればOKということで.

方法


長い前節を経ていよいよ本題です.
方法とは言ってもI/Oボードを外すだけなのですが.

くれぐれも自己責任でおねがいします.

1. I/Oボード無しで起動できるかの確認

まずMacBook Proの裏蓋を開けてバッテリコネクタを外し, I/Oボードとロジックボードの接続ケーブルを外します.

ここでAppleのサポートは消滅します.
バッテリコネクタのみを接続し直し, command+Rまたはoption等の適当なキーコンビネーションで起動できるか確かめます.
ここで起動できない場合は残念ながら今回の手法は使えません.

2. Mavericksのインストール

EFIブートROMを書き込むために一度Mavericksをインストールします.
正直EFIブートROMを書き込んだ後にもHigh Sierraの動作が若干不安定だったので, これに意味があるのかはわかりませんが, とりあえずおまじない代わりにでもやっておきます.

command+RのmacOS復元や, 任意のバージョンのインストールディスク等適当な方法でMarvericksをインストールしてください.
Mavericksのインストーラは現在AppleのHPからダウンロードできないので, mas-cli等を使いどうにかこうにか入手します.

SSDをフォーマットせずに実行したら失敗したのでフォーマット推奨です.
当然データは消えるので, ターゲットディスクモードやシングルユーザモードでデータの移行をしておきましょう.

3. EFIブートROMの書き込み

Mavericksを入れたらEFIブートROMを書き込んでいくのですが, Appleから落としてきたpkgファイルを実行しようとしても「もう最新バージョンが入ってるから意味ないで」というようなメッセージが出て実行できません.
そこで以下のように操作を行います.

  1. AppleからEFIブートROMのDL
  2. pkg内のscapファイルを取り出して sudo bless -mount / -firmware /path/firmware.scap
  3. 再起動

この処理をした後, I/Oボードをつけた状態でHigh Sierraにアップデートしたら見事に起動しなかったので, 十中八九失敗してます. (Sierraは起動しました.)
何か他にやり方がありそうなもんですが全くわかりません. 教えてエロい人.

4. Big Surのインストール

何が最適な方法なのかはわかりませんが, 今回僕は検証も兼ねて
1. Mavericks
2. Yosemite
3. El Capitan
4. Sierra
5. High Sierra
6. Catalina
7. Big Sur
の順番でインストールしました.
ただ, Sierra~Catalinaの時, すなわちBig Surを除くmacOS時にI/Oボードを接続していると起動しなかったので, 任意のOSをインストールする前に一度Big Surまで駆け抜けるのがミソなのかなと.

5. I/Oボード再接続

一度システム終了してから, 1で外したケーブルを再接続してBig Surの起動確認をします.
(tweet内の「モッサモサ」は再起動で解消されました)

ここで起動しない場合はI/Oボード無しでの運用若しくはOS Xでの運用になります.
I/Oボードが無くても右側I/OポートとWi-Fi, BTが使えなくなるだけなので...

6. 任意のOSにダウングレード

必要であれば, 適当なインストールディスクを作成する等して任意のOSにダウングレードしてください.
一度Mavericksに戻し, El Capitan -> High Sierra -> Yosemite -> Catalinaの順でインストールしましたが, Big Surインストール後ではI/Oボードを付けたまま全て正常に起動できました.

終わりに

ここまでやっておいてなんですが, Macの起動プロセスが「POST -> ジャーン -> EFI」らしいので, EFIというよりもPOST(Power-On Self-Test)の方で問題が起きてそうな気もします.
とは言えI/Oボードは他のMacBook Proで普通に使えたので, ロジックボードとの相性問題でしょうか.
そういえば再度インストールしたBig Surのバージョンが11ではなく11.1でした.
ということは今回の故障は初期Big Surによるファームウェアアップデート時の破損ではなく, 元々の仕様でI/Oボードとの相性悪化が原因...?

最初I/Oボードを取り付けた状態でOS Xは正常に起動できてmacOSは起動しなかったことも気になりますが, ま〜〜〜サッパリです.

と、いうわけでいかがでしたか?

今回はBig Surに文鎮化されたMacBook Proの復旧方法について調べてみました!

やはり林檎なだけあって, 本質は皮に包まれて改善できませんでしたね!

しかし, 難易度が高いほどモチベーションが上がると言うもの!
今後もAppleの動向から目が離せませんね!

それでは, ここまで読んでいただきありがとうございました!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

iPhoneのスクリーンタイムをデータとしてスプレッドシートに記録してみた

はじめに

スマホ、触りすぎていませんか?

私は隙があればついついスマホでYouTubeやSNSを長々と見てしまいます。YouTubeを始めた芸能人も多く、無限にコンテンツを楽しめてしまいますよね。コロナ渦で自宅にいることが増えたこともあってか、スクリーンタイムを見て唖然としてしまう日も少なくありません...。

そんな中、スクリーンタイムをSNSに投稿して勉強のモチベーションにしている受験生を見て、こういう使い方もあるんだなぁと感心しました。
とはいえ、わざわざ設定画面を開いてスクショを撮り、それをトリミングしてSNSに手動で投稿するのは少々面倒に感じます()

幸いなことに、macからも同じApple IDで登録されてデバイスのスクリーンタイムを見ることができます。また、macにはAutomatorという操作を自動化するアプリケーションがあります。
さらに、Googleが公開しているCloud Vison APIを使えば、画像から文字を抽出することができます。

これらを上手いこと使って自動で「iPhoneのスクリーンタイムをデータとして記録する」までを行ってみました。
日々の生活を記録することで自己管理を効率化できるのではないかと思います!

スクリーンタイムについて

アートボード – 4.png

スクリーンタイムで見れる項目には、

  • App使用時間
  • 通知
  • 持ち上げ/再開回数

があります。
macのスクリーンタイム画面からは、サイドバーからこれらを選択して各項目の利用状況のグラフを見ることができます。注目すべきはシステム環境はウインドウサイズが一定で、スクリーンタイム内の文字やグラフの配置も同じような箇所にあることです。そのため、OCRで読み取りたい箇所だけを決め打ちでトリミングできます。

Automator

文字認識をしたいスクリーンタイムの画像を取得するためにAutomatorを使います。
Automatorの大まかな流れはこのような感じです。

  1. システム環境設定を開く
  2. 操作を記録して、スクリーンタイムを開き、取得したいデバイスを選択する
  3. 「App使用時間」「通知」「持ち上げ/再開回数」それぞれでスクリーンショットを撮影 & OCRしたい箇所をトリミング
  4. トリミングした画像をくっつけてVisonAPIでテキスト取得、スプレッドシートに記録

Automator

Automatorの詳細

システムの外観モードを変更

起動したタイミングで外観モードをライトに変更しています。

AppleScript

「アプリケーションを開く」でシステム環境設定を開くと画面が手前にならないことがあり、操作を記録のステップで処理がコケてしまうのでAppleScriptで起動しています。

tell application "System Preferences"
    activate
end tell

操作を記録

Automatorアプリの:red_circle:(記録)ボタンを押して、システム環境設定 > スクリーンタイム > デバイスの選択 > 日付を昨日に変更 までの流れをを記録させています

アートボード – 5 3.png

シェルスクリプトを実行

screencaptureコマンドで画面のスクリーンショットを撮影します。-lオプションで指定したwindow1dの画面を撮影することができます。また、-xは撮影音OFF、-oはスクリーンショットの影をなくすオプションです。
前の手順でクリックした直後に撮影しないように念のためシェルスクリプトの最初でsleep 1sとしています。

sleep 1s
dir="$HOME/lifelog"
filepath=$dir/`date -v -1d +%Y%m%d`_screentime.png
crop="/tmp/cropped_1.png"
screencapture -xo -l$(osascript -e 'tell app "システム環境設定" to id of window 1') $filepath
/usr/local/bin/convert $filepath -crop 828x574+466+152 $filepath  # パスが通っていないので、フルパスで書く
/usr/local/bin/convert $filepath +repage -crop 400x60+20+60 $crop

操作を記録

システム環境設定のサイドバーにある「通知」のクリック操作を記録しています。「通知」をクリックした後は上記と同じ内容のシェルスクリプトを実行します。「持ち上げ/再開」でも同様に行います。

アートボード – 5.png

画像の結合とVisionAPI

/usr/local/bin/convert /tmp/cropped_1.png /tmp/cropped_2.png /tmp/cropped_3.png -append /tmp/combined.png
python record_screentime.py  # Vision APIとシートに記録

スクリーンショットとトリミング

macでは、screencaptureコマンドでCLIからスクリーンショットを撮影できます。
トリミングにはImageMagickのconvertコマンドを使用しています。-cropオプションの値には、(width)x(height)+(left)+(top)を指定しています。
また、一度cropした画像にさらにcropしようとするとconvert: geometry does not contain imageというエラーが出てしまいましたが、-cropの前に+repageをつけることで解消できました。

# ウインドウを指定してスクリーンショットを撮影
screencapture -xo -l$(osascript -e 'tell app "システム環境設定" to id of window 1') screentime.png
# crop
convert screentime.png -crop 828x574+466+152 screentime.png
# OCRしたい箇所でさらにcrop
convert screentime.png +repage -crop 400x60+20+60 screentime_cropped.png

上記コマンドでOCRで文字認識したい箇所でcropすると、

  • App使用時間

cropped_1.png

  • 通知
    cropped_2.png

  • 持ち上げ/再開回数
    cropped_3.png

のようになります。これらを結合した画像をVisino APIに投げます。画像の結合は、以下のコマンドで行いました。+appendで縦方向、-appendで横方向に結合できます。

convert /tmp/cropped_1.png /tmp/cropped_2.png /tmp/cropped_3.png -append /tmp/combined.png

結合した画像

combined.png

これで準備完了です。

Vision APIとシートに記録

いよいよ準備した画像を使って、文字認識を行ってデータとして保存します。
以下の記事などを参考にさせていただきました。:bow:

import gspread
import json
from datetime import datetime, timedelta
from oauth2client.service_account import ServiceAccountCredentials 
import os
import io
import re
from google.cloud import vision

credential_path = '【サービスアカウントキーのパス】'

os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = credential_path
file_path = "/tmp/combined.png"
with io.open(file_path, "rb") as image_file:
    content = image_file.read()
image = vision.Image(content=content)

client = vision.ImageAnnotatorClient()
response = client.text_detection(image=image)
data = response.text_annotations[0].description.split()  # [0]でfull textを取得

scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
credentials = ServiceAccountCredentials.from_json_keyfile_name(credential_path, scope)
gc = gspread.authorize(credentials)
SPREADSHEET_KEY = '【スプレッドシートのキー】'
worksheet = gc.open_by_key(SPREADSHEET_KEY).sheet1

yesterday = datetime.today() - timedelta(days=1)
date = datetime.strftime(yesterday, '%Y/%m/%d')

d = re.findall("\d+", data[0])  # 'xx時間yy分` -> ['xx','yy']
d = list(map(int, d))
if len(d) == 2:  # xx時間yy分の場合
    data[0] = d[0]* 60 + d[1]
elif len(d) == 1:  # yy分の場合
    data[0] = d[0]

data = list(map(int, data))
data.insert(0, date)
worksheet.append_row(data, value_input_option="USER_ENTERED")

実行すると...
スクリーンショット 2020-12-15 20.44.23.png

スクリーンタイムのデータがシートに反映されました!
あとはAutomatorのアプリを起動すれば今までの処理を自動で行ってくれます。(本当はcronで設定したかったけど、画面操作があるためできませんでした。。)

ちなみに、VisionAPIを使った文字認識の結果はこうなりました。緑がParagraph、黄色が文字を表しています。きれいに認識できていますね。
スクリーンショット 2020-12-15 20.47.28.png

おわりに

自動化ソフトや画像認識のツールを使って、スクリーンタイムをログに残してみました。せっかくならスクショだけはでなくて数字で記録に残せるといいですよね。
VisionAPIは1ヶ月1000リクエストまで無料なので毎日スクリーンタイムを記録して問題なさそうです。

今のところスクリーンタイムを記録する術は英語でググっても見つからなかったので、この記事が誰かの参考になれば幸いです。

(Appleさん、スクリーンタイムもヘルスケアから読み取れるようにしてください)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

iPhoneのスクリーンタイムをOCRで記録してみた

はじめに

スマホ、触りすぎていませんか?

私は隙があればついついスマホでYouTubeやSNSを長々と見てしまいます。YouTubeを始めた芸能人も多く、無限にコンテンツを楽しめてしまいますよね。コロナ渦で自宅にいることが増えたこともあってか、スクリーンタイムを見て唖然としてしまう日も少なくありません...。

そんな中、スクリーンタイムをSNSに投稿して勉強のモチベーションにしている受験生を見て、こういう使い方もあるんだなぁと感心しました。
とはいえ、わざわざ設定画面を開いてスクショを撮り、それをトリミングしてSNSに手動で投稿するのは少々面倒に感じます()

幸いなことに、macからも同じApple IDで登録されてデバイスのスクリーンタイムを見ることができます。また、macにはAutomatorという操作を自動化するアプリケーションがあります。
さらに、Googleが公開しているCloud Vison APIを使えば、画像から文字を抽出することができます。

これらを上手いこと使って自動で「iPhoneのスクリーンタイムをデータとして記録する」までを行ってみました。
日々の生活を記録することで自己管理を効率化できるのではないかと思います!

スクリーンタイムについて

アートボード – 4.png

スクリーンタイムで見れる項目には、

  • App使用時間
  • 通知
  • 持ち上げ/再開回数

があります。
macのスクリーンタイム画面からは、サイドバーからこれらを選択して各項目の利用状況のグラフを見ることができます。注目すべきはシステム環境はウインドウサイズが一定で、スクリーンタイム内の文字やグラフの配置も同じような箇所にあることです。そのため、OCRで読み取りたい箇所だけを決め打ちでトリミングできます。

Automator

文字認識をしたいスクリーンタイムの画像を取得するためにAutomatorを使います。
Automatorの大まかな流れはこのような感じです。

  1. システム環境設定を開く
  2. 操作を記録して、スクリーンタイムを開き、取得したいデバイスを選択する
  3. 「App使用時間」「通知」「持ち上げ/再開回数」それぞれでスクリーンショットを撮影 & OCRしたい箇所をトリミング
  4. トリミングした画像をくっつけてVisonAPIでテキスト取得、スプレッドシートに記録

Automator

Automatorの詳細

システムの外観モードを変更

起動したタイミングで外観モードをライトに変更しています。

AppleScript

「アプリケーションを開く」でシステム環境設定を開くと画面が手前にならないことがあり、操作を記録のステップで処理がコケてしまうのでAppleScriptで起動しています。

tell application "System Preferences"
    activate
end tell

操作を記録

Automatorアプリの:red_circle:(記録)ボタンを押して、システム環境設定 > スクリーンタイム > デバイスの選択 > 日付を昨日に変更 までの流れをを記録させています

アートボード – 5 3.png

シェルスクリプトを実行

screencaptureコマンドで画面のスクリーンショットを撮影します。-lオプションで指定したwindow1dの画面を撮影することができます。また、-xは撮影音OFF、-oはスクリーンショットの影をなくすオプションです。
前の手順でクリックした直後に撮影しないように念のためシェルスクリプトの最初でsleep 1sとしています。

sleep 1s
dir="$HOME/lifelog"
filepath=$dir/`date -v -1d +%Y%m%d`_screentime.png
crop="/tmp/cropped_1.png"
screencapture -xo -l$(osascript -e 'tell app "システム環境設定" to id of window 1') $filepath
/usr/local/bin/convert $filepath -crop 828x574+466+152 $filepath  # パスが通っていないので、フルパスで書く
/usr/local/bin/convert $filepath +repage -crop 400x60+20+60 $crop

操作を記録

システム環境設定のサイドバーにある「通知」のクリック操作を記録しています。「通知」をクリックした後は上記と同じ内容のシェルスクリプトを実行します。「持ち上げ/再開」でも同様に行います。

アートボード – 5.png

画像の結合とVisionAPI

/usr/local/bin/convert /tmp/cropped_1.png /tmp/cropped_2.png /tmp/cropped_3.png -append /tmp/combined.png
python record_screentime.py  # Vision APIとシートに記録

スクリーンショットとトリミング

macでは、screencaptureコマンドでCLIからスクリーンショットを撮影できます。
トリミングにはImageMagickのconvertコマンドを使用しています。-cropオプションの値には、(width)x(height)+(left)+(top)を指定しています。
また、一度cropした画像にさらにcropしようとするとconvert: geometry does not contain imageというエラーが出てしまいましたが、-cropの前に+repageをつけることで解消できました。

# ウインドウを指定してスクリーンショットを撮影
screencapture -xo -l$(osascript -e 'tell app "システム環境設定" to id of window 1') screentime.png
# crop
convert screentime.png -crop 828x574+466+152 screentime.png
# OCRしたい箇所でさらにcrop
convert screentime.png +repage -crop 400x60+20+60 screentime_cropped.png

上記コマンドでOCRで文字認識したい箇所でcropすると、

  • App使用時間

cropped_1.png

  • 通知
    cropped_2.png

  • 持ち上げ/再開回数
    cropped_3.png

のようになります。これらを結合した画像をVisino APIに投げます。画像の結合は、以下のコマンドで行いました。+appendで縦方向、-appendで横方向に結合できます。

convert /tmp/cropped_1.png /tmp/cropped_2.png /tmp/cropped_3.png -append /tmp/combined.png

結合した画像

combined.png

これで準備完了です。

Vision APIとシートに記録

いよいよ準備した画像を使って、文字認識を行ってデータとして保存します。
以下の記事などを参考にさせていただきました。:bow:

import gspread
import json
from datetime import datetime, timedelta
from oauth2client.service_account import ServiceAccountCredentials 
import os
import io
import re
from google.cloud import vision

credential_path = '【サービスアカウントキーのパス】'

os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = credential_path
file_path = "/tmp/combined.png"
with io.open(file_path, "rb") as image_file:
    content = image_file.read()
image = vision.Image(content=content)

client = vision.ImageAnnotatorClient()
response = client.text_detection(image=image)
data = response.text_annotations[0].description.split()  # [0]でfull textを取得

scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
credentials = ServiceAccountCredentials.from_json_keyfile_name(credential_path, scope)
gc = gspread.authorize(credentials)
SPREADSHEET_KEY = '【スプレッドシートのキー】'
worksheet = gc.open_by_key(SPREADSHEET_KEY).sheet1

yesterday = datetime.today() - timedelta(days=1)
date = datetime.strftime(yesterday, '%Y/%m/%d')

d = re.findall("\d+", data[0])  # 'xx時間yy分` -> ['xx','yy']
d = list(map(int, d))
if len(d) == 2:  # xx時間yy分の場合
    data[0] = d[0]* 60 + d[1]
elif len(d) == 1:  # yy分の場合
    data[0] = d[0]

data = list(map(int, data))
data.insert(0, date)
worksheet.append_row(data, value_input_option="USER_ENTERED")

実行すると...
スクリーンショット 2020-12-15 20.44.23.png

スクリーンタイムのデータがシートに反映されました!
あとはAutomatorのアプリを起動すれば今までの処理を自動で行ってくれます。(本当はcronで設定したかったけど、画面操作があるためできませんでした。。)

ちなみに、VisionAPIを使った文字認識の結果はこうなりました。緑がParagraph、黄色が文字を表しています。きれいに認識できていますね。
スクリーンショット 2020-12-15 20.47.28.png

おわりに

自動化ソフトや画像認識のツールを使って、スクリーンタイムをログに残してみました。せっかくならスクショだけはでなくて数字で記録に残せるといいですよね。
VisionAPIは1ヶ月1000リクエストまで無料なので毎日スクリーンタイムを記録して問題なさそうです。

今のところスクリーンタイムを記録する術は英語でググっても見つからなかったので、この記事が誰かの参考になれば幸いです。

(Appleさん、スクリーンタイムもヘルスケアから読み取れるようにしてください)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

第11回、RubyでClass化

Mac OS-11.0.1 ruby-2.6.6p146

Class

本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です
Ruby で Class を扱っていきます。

Class化する前のhelloメソッド

def hello(name)
  puts "hello #{name}"
end

def gets_name
  name = ARGV[0]
  if name == nil
    puts "What\'s your name? "
    name = gets.chomp
  end
  return name
end

hello gets_name

これに対して、Hello Classを定義して、RubyにおけるClassをみていきます

いきなりClass化

いきなりですが、Class化が完了したソースコードを拝見。

class Hello
  def initialize
    @name = gets_name
    puts_hello
  end

  def puts_hello
    puts "Hello #{@name}."
  end

  def gets_name
    name = ARGV[0] || 'world'
    return name.capitalize
  end
end

Hello.new

なるほど。簡単やん。ここで注目すべきポイントを下に記述します。

  • initialize
    • これはいわゆるコンストラクタ。
  • @name
    • これはClassのメンバー変数となる。(アットマークをつける)
  • capitalize
    • 大文字にしてくれる。英単語そのままやけど。
  • Hello.new
    • これでハローclassの宣言が可能となる。

継承とかオーバーライド

これに関してもコードをみて学習。

# 継承
class Hello < String
  def hello
    "Hello #{self}."
  end
end

# オーバーライド
class String
  def hello
    "Hello #{self}."
  end
end

なるほど。すごく単純。ここで改めて思うこと、Ruby ってめちゃめちゃ簡単やし単純やし学習コスト低いなー。
ちなみに呼び出しとか使用は以下の通り

require 'colorize'
# 継承呼び出し
greeter = Hello.new(ARGV[0])
puts greeter.hello.green

# オーバーライド呼び出し
puts ARGV[0].hello.green

Ruby簡単。Cで組込み開発してるけどしたくなくなる。以上。


  • source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no11.org
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

macでGNUコマンドを使う

背景

Unixコマンドを書籍やブログ通りに実行しても同じ結果にならない。。。ので調べていると、UnixコマンドはBSD系のOS(macOSやFreeBSD)とLinux系のOS(GNU)で異なる実装がされているのですね。
自分の環境(macOS)でもGNUコマンドが使用できるようにします。

参考:Homebrew で macOS に GNU コマンドをインストールする

環境

PC: MacBook Pro 2020
OS: macOS Catalina (10.15.5)
shell: zsh (5.7.1)

方法

Homebrewでインストールします。

brew install coreutils
brew install grep

coreutilsではcutやsortなど複数のコマンドがインストールされます。
root_cb6ba2bbd7c6___Users_tt.png
既存のコマンドと区別するためGNUコマンドはgを先頭につけるようにとあります。すなわちGNUのcutやsortを使う場合はgcutやgsortと入力します。
coreutilsでインストールされたコマンドは「/usr/local/Cellar/coreutils/8.32/bin」にあります。
root_cb6ba2bbd7c6___Users_tt.png
個人的に使いたかったgrepはcoreutilsには含まれていないので別途インストールしています。

結果

grep(BSD grep)とggrep(GNU grep)のバージョン情報を表示させてみます。問題なくインストールできているようです。

grep --version; ggrep --version

root_cb6ba2bbd7c6___Users_tt.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MacOS Big Surアップグレード後VirtualboxのGUIが動かなくなった際の対処

いきなり対処法(結論)から

下記を実行する。

  1. VirtualBox(とそのExtension)をアンインストールする
  2. MacOSをCmd + Rを押し続けながら再起動する(Recovery modeへ入ります)
  3. Recovery modeでTerminalを開く
  4. 下記のコマンドを実行する
csrutil clear
reboot

この後VirtualBoxをHomebrewなりインストーラを起動するなりでインストールする。
必要に応じてSecurity & PrivacyのGeneralタブからOracle Extensionを許可する。

経緯

MacOS Big SurでVirtualBoxが正常に動作しない問題は現在(2020年12月15日)こちらのチケットで進行中。
Qiitaでも色々な方が対処法を記載して頂いているようです。

ただ私の環境だとこれらの対処法では解決せず、VagrantのBackendにVirtualBoxを使っている関係上
かなり困っていました。
4,5時間程度色々な対処法を検索しては試しを繰り返していたのですが、ようやくこちらの手順で解決できました。
どうにも許可設定周りがバグってる感じで、リセットしたくてVirtualBoxに付属のアンインストールスクリプトを実行したり再起動したりしていましたが、
いずれも解決には至りませんでした。

同様に困っている人の助けになれば幸いです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

node.jsを自分のMacにインストールした

備忘録として。
node.jsを自宅のMacにインストールしようと思う

Homebrewから今回はやってみた
HomebrewとはMacOSで広く使われるパッケージ管理システム。。らしい

Homebrewを下記URLからまずインストール
https://brew.sh/index_ja

ターミナルで
brew -v
とコマンドを入力したら下記のようにバージョンが表記されたらインストール完了

Homebrew 2.6.1
Homebrew/homebrew-core (git revision dfe59; last commit 2020-12-14)

そしたらいよいよnode.jsのインストールへ。

brew install nodebrew

インストールが完了したら下記コマンドで確認

nodebrew -v

nodebrew 1.0.1~~
上記のようなばーじょんから始まる長ったらしい文が表示されたらOK

続いて下記コマンドを入力

nodebrew ls-remote

したら、ズラーっとvX.XX.Xのような表記でバージョンが並べられる
どのバージョンでもいいが推奨のバージョンをインストールする方がいいと思われるので、
今回は推奨バージョンをインストールすることに。
調べたら下記コマンドで推奨バージョンをインストールできるらしい

nodebrew install-binary stable

僕の場合ここでエラーが出てしまった
調べたところフォルダを作ってあげなきゃいけないみたいで
こちらのコマンドで作成。。。

mkdir -p ~/.nodebrew/src

インストール完了したらバージョンを確認

nodebrew ls

下記のように表示されればOK
現在インストールされてるバージョンが羅列される
ちなみにcurrentの部分には現在使用中のバージョンが入る

v14.15.1

current: none

useの後に使用するバージョンを選択

nodebrew use v14.15.1

もう一度nodebrew lsを試したら

v14.15.1

current: v14.15.1

上記のようにcurrentに入る
次は環境パスの設定
環境パスとはフルパスを指定せずソフト名のみを指定するだけで
プログラムを起動できるようにシステムに予め設定しているパス。
'>>'の後には各SHELLごとに合わせたファイルを指定
自分はzshだったので~/.zprofileを指定

echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.zprofile

そしたらnodeコマンドを実行

node -v

インストールしたバージョンが表示されたらOK
以上でnode.jsインストール完了

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む