オタク野郎の逆襲

普通のやつらの斜め上を行け

Ubuntu18.0.4でAndroidエミュレータの動作環境を構築する

概要

LinuxAndroidエミュレータを動作させるにはKVM(OS仮想化環境)が必要ですので

以下はKVMのインストール&セットアップ手順になります。

手順

CPUがハードウェア仮想化をサポートしているか確認

コマンドの実行結果が0なら仮想化がサポートされていないので、エミュレータは動作しません。

1以上ならOK。

egrep -c '(vmx|svm)' /proc/cpuinfo
KVMのインストール
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils
virt-managerのインストール

KVMのインストール手順を色々みていたら一緒にインストールされていたので入れましたが

必須かどうかよくわかってません。いらないかも。

sudo apt install virt-manager
KVMの実行権限をユーザに付与

KVMを現在のユーザで実行可能にするため、ユーザを追加します。

sudo adduser $USER kvm

下記コマンドを実行し、現在のユーザが表示されていればOK。

grep kvm /etc/group
AVDマネージャから仮想デバイスを作成

あとはWin&Macと同じようにAndroid StudioのAVDマネージャから仮想デバイスを作成すれば起動するはずです。

System.out.println()と打つのがめんどくさい問題の対処法

はじめに

JavaでSystem.out.println()とタイピングするのがめんどくさくてうんざりしてる人向けに対処法をまとめておきます。主に検証コードを書く時に役に立つテクニックかと思います。あとは個人的に最近AtCoderをやっているので、Javaでやるなら大事かなと。

IDEでコード補完する

有名どころのIDEは全て試しましたが、全てのIDEがコード補完(sout or sysoutと打ってコード補完⇒System.out.println()に変換される)に対応していました。

Eclipse

soutsysoutの両方に対応していました。
他に候補がない状態だと自動的に変換までやってくれるので、試した中では一番スマートでした。

IntelliJ IDEA

流石は有料のIDEというべきか、soutに加えて亜種(soutm,soutv,soutp)がいくつか定義されています。

sout⇒基本Eclipseと同じだが、こちらは候補の表示までなのでEnterで確定させる。

soutm⇒パラメータにSystem.out.println("Main.main");みたいな感じでクラス名とメソッド名まで勝手に入れてくれるサービス精神旺盛な機能。個人的にはイラネ。

soutv⇒パラメータに直前の変数を自動反映してくれる。

soutp⇒パラメータにメソッド引数を自動反映してくれる。

VS Code

Javaを書くのに使う事がないので正直よくわかってないですが、java開発用にはJava Extension Packを入れればいいっぽいので拡張をインストール(この記事のために)。
sysoutに対応していました。補完候補に出てくるのでEnterで確定。

NetBeans

古いIDEなので期待していませんでしたが、soutに対応していました。
補完候補に出てくるのでEnterで確定。
一応調べたけど今使ってる人どんだけいるんだろう・・・。

Java標準APIで二分探索(バイナリサーチ)

はじめに

Javaで二分探索(バイナリサーチ)をやりたい場合、標準API(Arrays.binarySearch())が用意されているため、これを活用するのが最も簡単な実装方法です。(だと思う、知らんけど)

というわけで、この記事ではArrays.binarySearch()について調べた内容をまとめてみようと思います。

概要

まずはjavadocを見る。

https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/util/Arrays.html#binarySearch(int%5B%5D,int)

public static int binarySearch​(int[] a, int key)

バイナリ・サーチ・アルゴリズムを使用して、指定されたint値の配列から指定された値を検索します。 
この呼出しの前に、sort(int[])メソッドで配列をソートする必要があります。 リストがソートされていない場合、結果は定義されません。 
指定された値を持つ要素が配列に複数ある場合には、どれが検索されるかについての保証はありません。

パラメータ:
a - 検索される配列
key - 検索される値

戻り値:
配列内に検索キーがある場合は検索キーのインデックス。それ以外の場合は(-(挿入ポイント) - 1)。 
挿入時点は、そのキーが配列に挿入される時点として定義される。つまり、そのキーよりも大きな最初の要素のインデックス。
配列内のすべての要素が指定されたキーよりも小さい場合はa.length。
これにより、キーが見つかった場合にのみ戻り値が>= 0になることが保証される。

ざっくりまとめるとパラメータとしては検索対象の配列検索値を指定。

渡す配列はソート済みである必要があります。(これはバイナリサーチの前提条件ですね)

戻り値は検索値が見つかった場合、その配列要素のインデックスが返却される。見つからなかった場合はその値の挿入位置(挿入すると仮定して下から何番目の大きさか)がマイナス値で返ってきます。

マイナスは単にヒットしなかったことを表しているだけなので、後続処理で使用する場合はMath.abs()などで絶対値に変換するなりしよう。

検証

Arrays.binarySearch()の動作を確認するため、簡単な検証コードを書きました。

import java.util.Arrays;
import static java.lang.System.out;

public class Main {

    public static void main(String[] args) {

        int[] arr = new int[]{-4,-3,-2,2,3,4};

        out.println("Case01: " + Arrays.binarySearch(arr, -5));
        out.println("Case02: " + Arrays.binarySearch(arr, -4));
        out.println("Case03: " + Arrays.binarySearch(arr, -3));
        out.println("Case04: " + Arrays.binarySearch(arr, -2));
        out.println("Case05: " + Arrays.binarySearch(arr, -1));
        out.println("Case06: " + Arrays.binarySearch(arr, 0));
        out.println("Case07: " + Arrays.binarySearch(arr, 1));
        out.println("Case08: " + Arrays.binarySearch(arr, 2));
        out.println("Case09: " + Arrays.binarySearch(arr, 3));
        out.println("Case10: " + Arrays.binarySearch(arr, 4));
        out.println("Case11: " + Arrays.binarySearch(arr, 5));
    }
}
実行結果
Case01: -1
Case02: 0
Case03: 1
Case04: 2
Case05: -4
Case06: -4
Case07: -4
Case08: 3
Case09: 4
Case10: 5
Case11: -7

コードと結果を突き合わせて見ていくと

Case01:-5は配列に存在せず、配列内のどの値よりも小さいので-1。ヒットしない場合のインデックスは0はじまりではなく、-1,-2,...となっていくので注意。

Case02:-4は配列の最小値にヒットするため、0が返却される。

Case03、Case04:ヒットした配列要素のインデックスを返却。

Case05〜Case07:-1〜1は配列に存在しない&どれも挿入した場合、下から4番目の大きさになるため-4。

Case08〜Case10:ヒットした配列要素のインデックスを返却。

Case11:5は配列に存在せず、配列内(要素数6)のどの値よりも大きいので-7。

所感

ヒットしない場合の返却値が絶対値で見て1はじまりになっていて、0はじまりの配列の文化と噛み合わないことがありそうなので、これを使って後続の処理を書く場合は要注意かもしれない。Arrays.binarySearch()は今回使用したメソッド以外にもパラメータ違いのメソッドが多数あるので実際に使用するときはjavadocを確認すべし。

https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/util/Arrays.html#binarySearch

Android StudioからiOSシミュレータに接続できない問題の対処

タイトルの通り、Macで起動したiOSシミュレータにAndroid Studioから接続できない(というか検出されない)問題の対処をしたのでメモしておく。

いきなり結論から書くと下記コマンドを叩くことで復旧した。
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer

参考リンク
https://stackoverflow.com/questions/9600615/xcode-stops-working-after-set-xcode-select-switch

調べたところXcodeデベロッパディレクトリというのを設定するコマンドらしい。Xcodeが複数バージョン入っている時に使用するXcodeを特定するために上記設定が必要なのはわかったけど、複数入れた記憶はないんだよなぁ・・・。

Visual Studio for Macのショートカットキー

カーソル移動

操作ショートカットキー
行頭移動Command + ← or Control + A
行末移動Command + → or Control + E
1Word(単語)進むOption + →
1Word(単語)戻るOption + ←
指定行に移動Command + L

コードジャンプ

操作ショートカットキー
宣言に移動Command + D or F12
元の位置に戻るCommand + Control + ←
進むCommand + Control + →

デバッグ

各操作の下段に書いたF10 or F11を使うショートカットはミュートやらボリュームダウンのショートカットと被っていてそっちが優先されるので微妙くさい。
カーソル行まで続行 and 続行は必要ならキーバインドをカスタマイズする感じで。

操作ショートカットキー
ステップオーバーShift + Command + O
or
F10
ステップインShift + Command + I
or
Command + F11
ステップアウトShift + Command + U
or
Shift + Command + F11
カーソル行まで実行Command + F10
続行なし(必要ならカスタマイズ可)

よく使うGitコマンドまとめ

リモートリポジトリをローカルに複製する
git clone リポジトリURL

ブランチを切り替える
git checkout ブランチ名

リモートブランチから新規ローカルブランチにチェックアウトし、新規ブランチに切り替える。
git checkout -b 新規ローカルブランチ名 origin/リモートブランチ名

ローカルの変更をリモートの同名ブランチに反映する。(なければ新規作成)
git push origin HEAD

リモートブランチの変更を取得する。(ローカルブランチには反映しない)
git fetch

指定したリモートブランチをカレントブランチにマージする。
git merge origin/ブランチ名

リモートブランチの変更を取得し、ローカルブランチに反映する。
git pull

カレントディレクトリ配下の全変更をステージングする
git add .

ステージングした資材をコミット
git commit -m "commit message"

直前のコミットメッセージを変更
git commit --amend -m "change message"

IntelliJ IDEAのショートカットキー(IdeaVim対応版)

はじめに

IdeaVimいれてる場合はCtrl + 単独キー系のショートカットが使えないので、IdeaVimで無効になるショートカットのみ代替Vimコマンドを載せています。Macのほうが影響少なめ。

コード編集

操作WindowsMac
コード補完Ctrl + SPACEControl + SPACE
ステートメント補完Shift + Ctrl + EnterShift + Command + Enter
クイックフィックスAlt + EnterOption + Enter
コードフォーマットCtrl + Alt + LCommand + Option + L
import編成Ctrl + Alt + OControl + Option + O
カーソル行を行ごと移動Alt + Shift + ↑ or ↓Option + Shift + ↑ or ↓
新しい行を追加Shift + EnterShift + Enter
現在行のカーソルを維持して改行Ctrl + EnterCommand + Enter
現在行を複製Ctrl + D
IdeaVimいれてるならyyp
Command + D
現在行を削除Ctrl + Y
IdeaVimいれてるならdd
Command + Delete
現在行と次の行を結合Shift + Ctrl + JShift + Control + J
選択範囲を拡張Ctrl + W
IdeaVimいれてると使用不可なので設定変更が必要
Option + ↑
選択範囲を縮小Shift + Ctrl + WOption + ↓

ナビゲート

操作WindowsMac
ナビゲーションバーに移動Alt + HomeShift + ↑
編集中のファイルで検索Ctrl + F
IdeaVimいれてるなら/検索文字
Command + F
編集中のファイルで置換Ctrl + R
IdeaVimいれてるなら:%s/検索文字/置換文字/gなど
Command + R
プロジェクト内全検索Shift + Ctrl + FShift + Command + F
プロジェクト内全置換Shift + Ctrl + RShift + Command + R
全てを検索(ファイル、クラス、メソッド、インターフェースなど)Shift + Shift Shift + Shift
クラスを検索Ctrl + N
IdeaVimいれてると使用不可なので設定変更が必要
Command + O
ファイルを検索Shift + Ctrl + NShift + Command + O
呼び出し箇所の検索クラスorメソッド上でCtrl + Alt + Hクラスorメソッド上でControl + Option + H
UMLを表示Ctrl + Alt + UControl + Option + U

ファイル操作

操作WindowsMac
リネームShift + F6Shift + F6

コードジャンプ

操作WindowsMac
指定行に移動するCtrl + L
IdeaVimいれてるなら:行番号
Command + L
定義箇所へジャンプCtrl + B
IdeaVimいれてるならCtrl + Alt + Bで代替するか、設定変更する
Command + B
コードジャンプを1つ戻すCtrl + Alt + ←Command + Option + ←
コードジャンプを1つ進めるCtrl + Alt + →Command + Option + →

実効 / デバッグ

操作WindowsMac
実効Shift + F10Control + R
IdeaVimいれてると使用不可なので設定変更が必要
デバッグ実行Shift + F9Control + D
IdeaVimいれてると使用不可なので設定変更が必要
ステップオーバーF8F8
ステップインF7F7
ステップアウトShift + F8Shift + F8
カーソル行まで実行Alt + F9Alt + F9
続行F9F9