- 投稿日:2020-03-31T23:38:33+09:00
iTerm2のカラースキームを時間帯によって自動的に変えよう
ずっと同じカラースキームでターミナルの画面を見ていると飽きるし、日中はライトテーマ・夕方はダークテーマにして気分をリフレッシュしたいと思いませんか? ですが、毎日いちいち手動で朝晩にテーマを切り替えるのは面倒なのでPythonにやらせます。
Python API
2019年7月にリリースされたiTerm2バージョン3.3.0からPython APIが提供されるようになりました(それ以前はAppleScriptというAPIがあったらしい?)。
pip install iterm2
すればiTerm2外部からもAPIを叩けます。APIを使用するには Preferences > General > Magic にある Enable Python API にチェックを入れます。
自前のスクリプトを用意したい場合、Scripts > Manage > New Python Script を選ぶとガイドが出てきて雛形を作ってくれます。
作成したPythonのコードは~/Library/Application Support/iTerm2/Scripts
に保存するようになっていますが、アプリ立ち上げ時に自動で読み込ませたい場合は上記のScripts
傘下にAutoLaunch
フォルダを作り、そこに保管します。実はカラースキームの自動切り替えスクリプトはフルスクラッチする必要がなく、公式の Example Scripts にほぼ完成形が用意してあります。
元のサンプルコードだとカラースキームの切り替え時にiTerm2が起動している必要があったので、アプリ起動時にも現在の時刻を参考に切り替えてくれるよう変更してあります。以下のコードを
~/Library/Application Support/iTerm2/Scripts/AutoLaunch/change_color.py
として保存してください。change_color.py#!/usr/bin/env python3.7 import asyncio import datetime import iterm2 # Clock time to change colors. LIGHT_TIME = (7, 0) DARK_TIME = (17, 0) # Color presets to use LIGHT_PRESET_NAME = "material" DARK_PRESET_NAME = "onedark" # Profiles to update PROFILES = ["Default"] def get_datetime(t, time): return datetime.datetime(t.year, t.month, t.day, time[0], time[1]) def datetime_after(t, time): today = get_datetime(t, time) if today > t: return today # Same time tomorrow return today + datetime.timedelta(1) def next_deadline_after(t): light_deadline = datetime_after(t, LIGHT_TIME) dark_deadline = datetime_after(t, DARK_TIME) if light_deadline < dark_deadline: return (LIGHT_PRESET_NAME, light_deadline) return (DARK_PRESET_NAME, dark_deadline) def get_duration(): now = datetime.datetime.now() preset_name, deadline = next_deadline_after(now) duration = (deadline - now).seconds print("Sleep for {} seconds until {}".format(duration, deadline)) return duration, preset_name async def set_colors(connection, preset_name): print("Change to preset {}".format(preset_name)) preset = await iterm2.ColorPreset.async_get(connection, preset_name) for partial in (await iterm2.PartialProfile.async_query(connection)): if partial.name in PROFILES: await partial.async_set_color_preset(preset) async def main(connection): now = datetime.datetime.now() begin = get_datetime(now, LIGHT_TIME) end = get_datetime(now, DARK_TIME) if (now > begin and now < end): await set_colors(connection, LIGHT_PRESET_NAME) else: await set_colors(connection, DARK_PRESET_NAME) while True: duration, preset_name = get_duration() await asyncio.sleep(duration) await set_colors(connection, preset_name) await asyncio.sleep(1) iterm2.run_forever(main)最初に定義した5つの定数
LIGHT_TIME=(7, 0)
: ライトテーマに切り替える時間(HH, MM)DARK_TIME=(16, 0)
: ダークテーマに切り替える時間(HH, MM)LIGHT_PRESET_NAME="..."
: ライトテーマ名(デフォルトテーマはLight Background
)DARK_PRESET_NAME="..."
: ダークテーマ名(デフォルトテーマはDark Background
)PROFILES=["..."]
: テーマを変更させるプロファイル名(複数選択可)は好みに合わせて変更してください。プロファイル名は自分の作ってあるプロファイル一覧から、テーマのプリセット名は右下の Color Presets... メニューから選びます。
ちなみに
print(...)
の標準出力や、存在しないプリセット名を指定してしまったときなどのエラーは Scripts > Manage > Console に吐き出されます。退屈なことPythonにやらせるのサイコ〜〜〜〜〜〜
参考
- 投稿日:2020-03-31T11:53:50+09:00
計算サーバのデータのバックアップに関するメモ
この記事は
ドライブやホストを跨いでバックアップする際の作業メモです。手元のどこかに書いているとそのメモの在りかが分からなくなってしまうのでここに書いています。
状況としては、普段SSH越しに利用している計算サーバ上のデータを、LAN内に置いているNASにバックアップする必要がありました(下の図)。
私個人の環境に合わせて書いているので、必要なところだけ掻い摘んで使ってください。なお、作業はMacのTerminalで行っています。作業
1. リモートホストのファイルシステムをマウント
sshfsを予めインストールしておく。Linuxならapt-getなどで入るし、Macはbrew caskでインストール可能。
また、マウント用に、適当なディレクトリ(以下ではmountpoint)を作成しておく。$> sshfs username@REMOTEHOST: ~/mountpointもし、リモートホストのホームディレクトリ(フロントサーバで初めに着地する場所)とは別のファイルシステムに置かれているファイルをsshfs越しに見る必要がある場合は、そこに予めシンボリックリンクを貼っておく。
sshfsはそのままではシンボリックリンクを読めないので、その場合は、-o follow_symlinks
をsshfsのオプションとして渡す。# ssh接続によるリモートホストでの作業 $> ln -s /ANOTHER_DRIVE/path $HOME/link_to_another_filesystem# 手元での作業 $> sshfs username@REMOTEHOST: ~/mountpoint -o follow_symlinks $> cd ~/mountpoint/link_to_another_filesystem # -o follow_symlinksを渡さない場合、これが失敗する2. バックアップ先のマウント
必要に応じて追加します。
NASのマウント
Linuxだと
cifs
というツールをインストールしたらNASをマウントできるようなのだが、どうも書き込みができない。
Macだと新たに何かをインストールする必要はなく、terminalに元から入っているmount
コマンドでマウント可能。上記のsshfsと同様に、マウント用のディレクトリを作っておく(以下ではmountpoint2)。mount -t smbfs //username@NAS_NAME/path ~/mountpoint23. rsync
3.1 同期するファイルを確認する
rsyncのオプションとして
n
を渡すとdry-runとなり、実際の作業はせずバックアップするファイルをリストするだけで終了する。これで、対象となるファイルを確認する。
--exclude="*.bin"
などで、バイナリなどバックアップから除外するファイルを指定する。注意する点として、コピー元のディレクトリの指定時に、
src_dir_name/
のようにセパレータ(/
)をつけた場合、コピー先のディレクトリ内(直下)に、src_dir_nameの子ディレクトリが作られる。
一方、src_dir_name
のようにセパレータを付けない場合は、コピー先のディレクトリ直下に同名のディレクトリ(ここでいうと、src_dir_name
)が作られ、その下に子ディレクトリが作られる。rsync -avn ~/mountpoint/src_dir_name ~/mountpoint2/dst_dir_name --exclude="*.bin"3.2 実行
上記で確認して問題なければ、
n
のオプションを外して実行する。rsync -av ~/mountpoint/src_dir_name ~/mountpoint2/dst_dir_name --exclude="*.bin"終わりに
何か知見が増えたらここにも追加します。
- 投稿日:2020-03-31T11:48:52+09:00
macでmysqlクライアント使うときの注意
Catalina で mysql クライント使おうと思った時に設定したことのメモ
インストール
$ brew install mysqlmy.cnf
homebrewでインストールした場合、my.cnf の場所は
/usr/local/etc/my.cnf
っぽい。
/etc/my.cnf
とかにはないので注意。/usr/local/etc/my.cnf# Default Homebrew MySQL server config [mysqld] # Only allow connections from localhost bind-address = 127.0.0.1 mysqlx-bind-address = 127.0.0.1初期値はこんな感じ。
日本語使うなら下記の記述を追記
[mysql] default-character-set = utf8リモートサーバー接続するときの注意
ポートフォワーディングでリモートサーバーのDBに接続しようとした際に、下記のようなErrorが表示された。
$ mysql -h 127.0.0.1 ERROR 2026 (HY000): SSL connection error: error:141A318A:SSL routines:tls_process_ske_dhe:dh key too smallSSL接続を強制されてなければ、
--ssl-mode=DISABLED
をつければOK。$ mysql --ssl-mode=DISABLED -h 127.0.0.1接続先のサーバー古すぎるからかも。
- 投稿日:2020-03-31T10:12:48+09:00
Xcodeのアプリケーション名を変更する際は半角スペースはNG
Xcodeのアプリケーション名を変更するとき、半角スペースを入れていたらドハマリしたよ、というお話です。
そもそもなんのために名前を変更?
業務でXcodeを利用していますが、いくつかのiOSアプリの保守を行っていて、そのうちの一つが古いバージョンのXcodeにしか対応していない(Swiftのバージョンが古い)ことなどが有り、Xcodeについて、最新版と古いものと、2種類をインストールしていました。
このとき、バージョンごとに使い分けができるように、Xcode.app
を、Xcode 11.3.1.app
とXcode 10.2.0.app
のように、バージョン番号を付与することで区別していました。何が起きた?
いい加減、古い環境のアプリをアップデートする必要が出てきたため、プロジェクト内で利用している
cocoapods
経由でインストールしている外部ライブラリについても更新しようと、久しぶりに Podfile を編集しpod update
を実行したところ、エラーとなりました。この辺り、ちょっと記録を残していなかったので曖昧なところなのですが、そもそもはおそらくVPNのネットワーク周り(プロキシの設定など)の問題でTerminalから外部にアクセスできなくなっていたのが問題だったっぽいんですが、エラー解消のため一度環境をきれいにしようと、 gemを使って cocoapods 自体をインストールし直したりしているうちに、ローカルのRuby関連のなにかのパスが見つからない、といった感じのエラーメッセージが出るようになり、 cocoapods 自体をインストールできない、といった感じでどんどんドツボにハマってしまいました…
結論
で、結果として、最終的に判明した原因は、タイトルの通り、
Xcode 11.3.1.app
としていた名前が問題で、これをXcode_11.3.1.app
のように変更してやることで、gem関連のコマンドなどもスムーズに通るようになりました。
ターミナル上でパスを指定するときは、たいていは途中に半角スペースがあっても、\
を自動的に保管してくれたりするので思いの外原因に気づくのに時間がかかってしまいました。めったにいないとは思いますが、同じことでお困りの方の参考になれば幸いです。
- 投稿日:2020-03-31T08:29:05+09:00
Mac Laravel 7 Authを用いたユーザ登録 ログイン ログアウトなどの機能を作成する
目的
- Laravel6以降のバージョンのアプリでAuthを用いたログイン系の機能を付与する方法をまとめる。
ちょっとした知識
- Authの機能はLaravel6以降だとデフォルトで用意されなくなった。
- Laravel6以降でAuthの機能を使用したい場合は本作業を実施する必要がある。
実施環境
- ハードウェア環境(下記の二つの環境で確認)
項目 情報 備考 OS macOS Catalina(10.15.3) ハードウェア MacBook Air (11-inch ,2012) プロセッサ 1.7 GHz デュアルコアIntel Core i5 メモリ 8 GB 1600 MHz DDR3 グラフィックス Intel HD Graphics 4000 1536 MB
項目 情報 OS macOS Catalina(10.15.3) ハードウェア MacBook Pro (16-inch ,2019) プロセッサ 2.6 GHz 6コアIntel Core i7 メモリ 16 GB 2667 MHz DDR4 グラフィックス AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB
- ソフトウェア環境
項目 情報 備考 PHP バージョン 7.4.3 Homwbrewを用いて導入 Laravel バージョン 7.0.8 commposerを用いて導入 MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いて導入 前提条件
- お使いのMacにNode.jsがインストールされていること。
- 未実施の方はこちら→Mac HomebrewでNode.jsをインストールする
- ローカル開発環境でサーバを起動してブラウザから確認できるLaravel6以上のアプリがあること。
- デフォルトのusersテーブル作成のマイグレーションファイルのマイグレートが完了していること。
実施方法概要
- laravel/uiのインストール
- Authのファイル取得
- フロントエンド側でのモジュール組み込み
- 確認
実施方法詳細
laravel/uiのインストール
アプリ名ディレクトリで下記コマンドを実行する。(環境にもよるが若干時間がかかる)
$ composer require laravel/uiAuthのファイル取得
アプリ名ディレクトリで下記コマンドを実行する。
$ php artisan ui vue --authフロントエンド側でのモジュール組み込み
アプリ名ディレクトリで下記コマンドを実行する。
$ npm install && npm run dev確認
- ローカルサーバを起動して下記のリンクにアクセスして下記の様に表示されることを確認する
- 投稿日:2020-03-31T01:22:46+09:00
卒論Texの書き方
環境構築
VSCodeで書いていく
ここに詳しいやり方は載っている
https://qiita.com/Gandats/items/d7718f12d71e688f3573
.latexmkrc
の設定後にlatexmk -silent report.tex
- 投稿日:2020-03-31T00:25:19+09:00
VisualStudioCodeにおけるデバッグコンソールへの出力設定
vscodeにてJavaのデバッグ環境を作ろうとしたところ、実行結果をデバッグコンソールに表示させられず、かなりつまづいたので書いておきます。
デバッグ環境を構築&デバッグ
まずは適当なサイトを参考にしながらJDKや拡張機能をインストール。そして、テストのためにJavaのファイルを作り、デバッグコンソールに文字列を表示するだけの簡単なコードを記述してみました。
参考にしていたサイトでは、この段階でデバッグを開始したら実行結果がデバッグコンソールに表示されていましたがここで問題発生。なぜかデバッグコンソールに「hello world」の文字列が表示されないのです。
JDKをインストールし直しても、拡張機能を入れ直しても、ファイルを作り直しても、一向に表示されない…
解決方法
どんなワードで検索しても解決策が見つからず、萎えてしまい一ヶ月が経過したとき、ふと「そういえばデバッグコンソールへの出力設定とかって無いのか?」と思いつきました。
早速、設定の検索窓に「DebugConsole」と入力してみると
それらしき雰囲気の設定項目が見つかった。
英語でよくわからないのでGoogle先生に聞くとJavaプログラムを起動するための指定されたコンソール。特定のデバッグセッション用にコンソールをカスタマイズする場合は、launch.jsonのコンソール設定を変更してください。
とのこと、いまいち訳がわかりにくいが恐らく「プログラムの実行結果を表示する場所を変えたいのなら、この設定を変更してください」という感じの意味合いだと思われる。
ということで、デフォルトとして選択されていた integratedTerminal から internalConsole へと設定を変更。そして試しにデバッグをしてみると…
しっかりデバッグコンソールに実行結果が表示されました。どうやらデフォルトの設定で、実行結果の出力先がターミナルになっていたようです。終わりに
皆さんもvscodeなどで何かつまづいたら、まずはソフト自体の設定にそれらしき項目がないか探してみましょう。今回のように意外と簡単な設定ミスかもしれません。