特殊なIPv6アドレスを利用することでIPv6アドレスを持つ端末から、IPv4アドレスのみを持つサイトへアクセスを可能とする技術です。 この技術により、混雑している従来のIPv4/PPPoE接続方式を使わず、IPv6/IPoE方式で大容量化されたネットワークに接続でき、快適に通信できます。
ブラウザ操作でもvimっぽく扱う vimvim ショートカット
以下のChrome拡張のショートカットで使いそうなものを記載しておきます。 chrome.google.com
これ以外にもありますので、知りたい方はvimiumを追加した状態で?を入力してください。helpが表示されます。
Vimiumはコマンドの繰り返しをサポートしているため、たとえば、「5t」を押すと、5つのタブが連続して開きます。ESC(または<c-[>)は、キュー内の部分的なコマンドをすべてクリアし、挿入モードと検索モードも終了します。
ページ移動
ショートカット | 説明 |
---|---|
j | 下スクロール |
k | 上スクロール |
h | 左スクロール |
l | 右スクロール |
d | 下へ半ページ移動 |
u | 上へ半ページ移動 |
gg | ページ最上部へ移動 |
G | ページ最下部へ移動 |
f | ページ内のリンクをマッピング(そのキーを入力するとジャンプ) |
F | ページ内のリンクをマッピング(そのキーを入力すると新タブで開く) |
H | 戻る(back) |
L | 進む(forward) |
r | ページの再読込 |
/ | ページ内検索 |
URL関連
ショートカット | 説明 |
---|---|
yy | 現在のURLをコピー |
p | コピーしてあるURLをカレントタブで開く |
P | コピーしてあるURLを新タブで開く |
検索など
ショートカット | 説明 |
---|---|
n | 検索結果次へ |
N | 検索結果前へ |
i | インサートモード |
タブ操作
ショートカット | 説明 |
---|---|
t | 新タブを開く |
gi | 一番上の入力ウィンドウに入力 |
o | 新しいタブで検索 |
J | タブを左へ移動 |
K | タブを右へ移動 |
x | タブを閉じる |
X | 消したタブをもとに戻す |
g0 | 最初のタブに移動 |
g $ | 最後のタブに移動 |
ブックマーク関連
ショートカット | 説明 |
---|---|
o | URL、ブックマーク、または履歴エントリを開く |
O | URL、ブックマーク、履歴エントリを新しいタブで開く |
b | ブックマークを開く |
B | ブックマークを新しいタブで開く |
Kotlin Coroutineの概念を理解する
以下でCoroutinの使い方をざっくり理解しました。
https://tamata78.hatenablog.com/entry/2021/09/06/174235
上記で理解を進める中でわからなかった概念を補足する情報を記載していきます。
CoroutineScope
- CoroutineScopeは、コルーチンビルダー関数である
launch
またはasync
を使用して作成したコルーチンを全て追跡します。 - 実行中のコルーチンは
scope.cancel()
を呼び出してキャンセル可能 - キャンセルされたスコープは、コルーチンをそれ以上作成できません。
class ExampleClass { // Job and Dispatcher are combined into a CoroutineContext which // will be discussed shortly val scope = CoroutineScope(Job() + Dispatchers.Main) fun exampleMethod() { // Starts a new coroutine within the scope scope.launch { // New coroutine that can call suspend functions fetchDocs() } } fun cleanUp() { // Cancel the scope to cancel ongoing coroutines work scope.cancel() } }
CoroutineScopeの生成時には、ジョブとスレッドプールであるディスパッチャを結合した値を設定する必要があります。
ジョブ
- ジョブはコルーチンのハンドル(管理側)です。
- 各コルーチンは、コルーチンのライフサイクルを管理する
Job
インスタンスを返却します。 - Jobを用いてコルーチンをキャンセルするなどのライフサイクル管理ができます。
class ExampleClass { ... fun exampleMethod() { // Handle to the coroutine, you can control its lifecycle val job = scope.launch { // New coroutine } if (...) { // Cancel the coroutine started above, this doesn't affect the scope // this coroutine was launched in job.cancel() } } }
CoroutineContext
コルーチンの設定のようなもの。 以下のCoroutineContext要素(設定項目)があります。
- Job: コルーチンのライフサイクルを制御
- CoroutineDispatcher: 適切なスレッドに処理を送信
- CoroutineName: コルーチンの名前。デバッグに用いる
- CoroutineExceptionHandler: キャッチされない例外を処理
上記の要素は以下のように割り当てられます。
- 新規コルーチン作成時に
Job
インスタンスが割り当てられます。 - Job以外のCoroutineContext要素は、コルーチンを含むスコープから継承されます。
- 継承された要素を変更するには、
launch
やasync
に変更対象要素を渡す必要があります。
class ExampleClass { val scope = CoroutineScope(Job() + Dispatchers.Main) fun exampleMethod() { // 新しいコルーチンの開始。ディスパッチャとコルーチン名をlanchの引数に設定すると変更できる val job = scope.launch(Dispatchers.Default + "BackgroundCoroutine") { // New coroutine with CoroutineName = "BackgroundCoroutine" (overridden) } } }
+演算子は文字列結合とは違う処理なんでしょうか。引数二つ指定ではないのが少し疑問。。
ディスパッチャ
- コルーチンは、ディスパッチャでコルーチンの実行スレッドを決定します。
- DBアクセス、外部API実行などメインスレッドの外部で実行する場合は、デフォルト or IOディスパッチャを指定します。
開発者が指定できるディスパッチャは以下の3つになります。
- Dispatchers.Main:UI を操作して処理を手早く作業する場合にのみ使用(suspend 関数の呼び出しなど)
- Dispatchers.IO:メインスレッドの外部でディスクまたはネットワークの I/O を実行する場合に使用(ファイルの読み書き、ネットワーク オペレーションの実行など)
- Dispatchers.Default :メインスレッドの外部で CPU 負荷の高い作業を実行する場合に使用(リストの並べ替えや JSON の解析など)
withContext()におけるディスパッチャ切り替え
- withContext(Dispatchers.IO)を呼び出すことで、IOスレッドプールで実行するブロックを生成します。
- get関数内は、IOディスパッチャ経由で実行されるようになります。
- withContext自体が中断関数であるため、ディスパッチャのメインスレッドを中断して、get関数内の処理を実行します。
suspend fun fetchDocs() { // Dispatchers.Main val result = get("developer.android.com") // Dispatchers.Main show(result) // Dispatchers.Main } suspend fun get(url: String) = // Dispatchers.Main withContext(Dispatchers.IO) { // Dispatchers.IO (main-safety block) /* perform network IO here */ // Dispatchers.IO (main-safety block) } // Dispatchers.Main }
withContext()コルーチンを作成せず、ディスパッチャの切り替えのみを行うため、パフォーマンスに優れている。
withContextブロックの処理が完了するとget以降の処理が再開されて処理が継続されます。
実装のポイント
コールーチンの使いどころ
実装時の注意点
実装していて、気づいた実装上の注意点を少し記載しておきます。
- コルーチン生成を乱立すると逆にスレッド切り替えで遅くなる可能性があります
- asyncのネストなどはできるだけ避ける。コルーチンが作られすぎでしまう
- launch、runblockなどのコルーチンビルダー関数は、ループ内で入れず、外に記載。これもコルーチンを大量に作ってしまい、逆に性能劣化を招く
コルーチン内での例外
scope.launch内でのasyncをすると例外をキャッチできずにクラッシュするということが発生したりする。
この場合は、「coroutineScopeをtry catchで囲む」という方法で対処すると良い。
コルーチンがネストしていると親コルーチンに例外が伝播してしまうが、asyncをscope.launchと別のコルーチンで囲むことでscope.launchのコルーチンへ例外を伝播させるのを止めることができ、クラッシュを防ぐことができるようだ。
以下の記事の説明がわかりやすかった。
Coroutines asyncとException - Kenji Abe - Medium
参考URL
Javaバージョンを切り替えるjEnvの基本コマンド
jenvのインストール
brewでインストール
brew install jenv
設定
Bashを使っている場合
echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.bash_profile echo 'eval "$(jenv init -)"' >> ~/.bash_profile
Zshを使っている場合
echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc echo 'eval "$(jenv init -)"' >> ~/.zshrc
ディレクトリを作成
mkdir ~/.jenv mkdir ~/.jenv/versions #.bash_profile を再読み込み source ~/.bash_profile # zshなら source ~/.zshrc
jenvのインストールに問題ないか確認
$ jenv doctor
インストール済のバージョンを確認
/usr/libexec/java_home -V Matching Java Virtual Machines (3): 16.0.2 (x86_64) "Oracle Corporation" - "OpenJDK 16.0.2" /Users/user/Library/Java/JavaVirtualMachines/openjdk-16.0.2/Contents/Home 16.0.1 (x86_64) "AdoptOpenJDK" - "AdoptOpenJDK 16" /Library/Java/JavaVirtualMachines/adoptopenjdk-16.jdk/Contents/Home 11.0.11 (x86_64) "AdoptOpenJDK" - "AdoptOpenJDK 11" /Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home
jenv環境へインストールJavaを追加
$ jenv add /Users/user/Library/Java/JavaVirtualMachines/openjdk-16.0.2/Contents/Home openjdk64-16.0.2 added 16.0.2 added 16.0 added 16 added $ jenv add /Library/Java/JavaVirtualMachines/adoptopenjdk-16.jdk/Contents/Home openjdk64-16.0.1 added 16.0.1 added 16.0 already present, skip installation 16 already present, skip installation $ jenv add /Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home openjdk64-11.0.11 added 11.0.11 added 11.0 added 11 added
jenvに追加されているJDKの一覧
先頭に*が表示されているJDKが有効化されている。
$ jenv versions * system (set by /Users/jpd20537/.jenv/version) 11 11.0 11.0.11 16 16.0 16.0.1 16.0.2 openjdk64-11.0.11 openjdk64-16.0.1 openjdk64-16.0.2
Javaの切り替え
# グローバル $ jenv global 1.8.0.222 # ローカル(特定のディレクトリのみに適用) $ jenv local 11.0 $jenv version 11.0.11 (set by /Users/user/workspace/project/.java-version)
設定されているJavaの確認
$ echo $JAVA_HOME /Users/user/.jenv/versions/11.0.11 ~/workspace/project $ java -version openjdk version "11.0.11" 2021-04-20 OpenJDK Runtime Environment AdoptOpenJDK-11.0.11+9 (build 11.0.11+9) OpenJDK 64-Bit Server VM AdoptOpenJDK-11.0.11+9 (build 11.0.11+9, mixed mode)
環境変数JAVA_HOMEの自動設定
$ jenv enable-plugin export
# 自動設定を解除するにはdisable-plugin export
Brewfile関連の基本コマンド
Mac OSの環境構築を自動化するツールの基本コマンドを記載していきます。
パッケージを探す
brew search # caskのパッケージも探せる mas search
パッケージのアップデート
$ brew upgrade $ brew upgrade --cask $ mas upgrade
インストール済みパッケージ一覧
$ brew list $ brew list --cask $ mas list
診断
インストールしたパッケージの管理状態を診断します。
$ brew doctor You have unlinked kags in your Cellarと表示されたらリンクを修正します。
リンクの修正
$ brew unlink (package name) $ brew link (package name) $ brew cleanup
環境移行
Brewfileの生成 新しい環境に引っ越す前に、インストール済みのパッケージを Brewfileに残します。
$ brew bundle dump
Brewfileからパッケージをインストール
新しい環境にBrewfileをコピーし、同じディレクトリ内に移動して下記を実行
$ brew bundle
Mac OS 開発環境初期設定
ターミナル
brew install
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" brew install cask
クライアントアプリ
アプリランチャー、コピペアプリ、 エディタ、docker、メニューカレンダー表示、ブルーライトカット
brew install --cask alfred brew install --cask clipy brew install --cask atom brew install --cask docker brew install --cask flux
DBクライアントツール. https://dbeaver.io/files/dbeaver-ce-latest-macos.dmg
Google 日本語入力 https://tools.google.com/dlpage/japaneseinput/eula.html?platform=mac
IDE
intellij https://www.jetbrains.com/ja-jp/idea/download/#section=mac