Ubuntu18.04でログインできないときの対処(nvidiaのGPUを積んでいてドライバがおかしい場合)

Ubuntu18.04でログインできない問題に遭遇したので解決策をメモっておきます。

症状

  • ログイン画面でパスワードを入力しても一度真っ暗になってすぐにログイン画面に戻される
  • CUIモードに入れない
  • 動作が重く、一回の打鍵で同じ文字が二文字入力されることがある。

原因

私の場合は、GPUのドライバが原因でした。

おとなしくnvidia公式のドライバをインストールしましょう。

解決法

sudo add-apt-repository ppa:graphic-drivers/ppa
sudo apt update
sudo apt install nvidia-390

最後の390はGPUに合わせて適切なものを調べてください。

これで再起動したらうまく動くはず。

ターミナルが開けない場合

ログインボタンの横の歯車マークを押して、Waylandで起動したらログインできるっぽいです。 打鍵一回で2回以上入力されることが多々あり、ストレスがたまります。

オンラインモブプロ会を企画しました。4/21 20:00~

オンラインモブプロ会というものを企画してみました。 名前の通り、一堂に会すことなくリモートでモブプログラミングをする会です。

なぜ始めようと思ったのか?

  • 勉強会って東京23区を始め大きな都市ばかりなので、オンラインで学べる環境が欲しかった。
  • ちょうどインフラ勉強会が流行っていたのでそれ系のノリで参加できるといいなと思った。
  • モブプログラミング非常に効果的なので、ぜひやりたかった。

初回告知

  • 第一回モブプロ会
  • テーマ:アイスブレイキング「要件がだんだん増えていくFizzBuzz
  • 日時:4/21 20:00~
  • 場所:Discord -> 招待リンク

こんな感じです。

まとめ

まあ、やってみなきゃわからないことも多いのでがんばります!

LWJGL 3 GuideをKotlinでやってみる

LWJGL(Lightweight Java Game Library) 3に興味を持って触っています。 まずはチュートリアルをやってみようということで、チュートリアルを書き写しました。Kotlinで。

ソースコード

package xxx.xxx

import org.lwjgl.*
import org.lwjgl.glfw.*
import org.lwjgl.opengl.*
import org.lwjgl.system.*

import java.nio.*

import org.lwjgl.glfw.Callbacks.*
import org.lwjgl.glfw.GLFW.*
import org.lwjgl.opengl.GL11.*
import org.lwjgl.system.MemoryStack.*
import org.lwjgl.system.MemoryUtil.*

class HelloWorld(var window: Long) {
    fun run() {
        println("Hello LWJGL " + Version.getVersion() + "!")

        init()
        loop()
        glfwFreeCallbacks(window)
        glfwDestroyWindow(window)

        glfwTerminate()
        glfwSetErrorCallback(null)!!.free()
    }

    fun init() {
        GLFWErrorCallback.createPrint(System.err).set()

        if (!glfwInit())
            throw IllegalStateException("Unable to initialize GLFW")

        glfwDefaultWindowHints()
        glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE)
        glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE)

        val w: Long? = glfwCreateWindow(300, 300, "Hello World!", NULL, NULL)
        window = w!!

        glfwSetKeyCallback(window, fun (window: Long, key: Int, _: Int, action: Int, _: Int) {
            if (key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE)
                glfwSetWindowShouldClose(window, true)
        })

        val stack: MemoryStack = stackPush()
        try {
            val pWidth: IntBuffer = stack.mallocInt(1)
            val pHeight: IntBuffer = stack.mallocInt(1)

            glfwGetWindowSize(window, pWidth, pHeight)

            val vm: GLFWVidMode? = glfwGetVideoMode(glfwGetPrimaryMonitor()) ?: throw RuntimeException("")
            val vidmode: GLFWVidMode = vm!!

            glfwSetWindowPos(
                    window,
                    (vidmode.width() - pWidth.get(0)) / 2,
                    (vidmode.height() - pHeight.get(0)) / 2
            )
        } finally {}

        glfwMakeContextCurrent(window)
        glfwSwapInterval(1)
        glfwShowWindow(window)
    }

    fun loop() {
        GL.createCapabilities()
        glClearColor(1.0f, 0.0f, 0.0f, 0.0f)

        while ( !glfwWindowShouldClose(window) ) {
            glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT)
            glfwSwapBuffers(window)
            glfwPollEvents()
        }
    }

    companion object {
        @JvmStatic fun main(args: Array<String>) {
            HelloWorld(0).run()
        }
    }
}

ポイント

JavaからKotlinへ書き換える際のポイント

\?:

名前を忘れたけれど、\?:でnullチェックできます。 kotlinはnull安全を保つために努力しているっぽいので、さっくり使います。

無名関数

kotlinの無名関数は、funで定義します。

まとめ

意外と簡単に書き換えられるみたい

簡易負荷試験の攻撃部分サンプルコードを書いてみました

gist: https://gist.github.com/aimof/46274e1bc6c1bbac1c0a43c665a8e144

負荷試験ツールっぽいものを簡単にコーディングしてみました。

何がしたかったか

簡単に言えば、github.com/tsenart/vegetaの真似事をしたかった感じです。 コマンドオプションは未実装です。 レポートする機能も未実装です。

機能

シンプルにgoroutine数を制御しながら並列で攻撃します。 病患10000アクセスくらいなら、localhostなら出ます。

gistでは時間を記録しないようになっていますが、重複カウントのために一旦外しました。

問題点

  • パラメータ調整を大きくしすぎると遅延し、いつ終わるかわからない。
  • 「何かあったときの」系が一切実装されていないため、安定運用にはほど遠い

Goにおいてチャネルの容量が0、すなわちバッファなしチャネルとはどういうことか?

Goの基本の一つとしてチャネルがあります。 真面目に学んでおかないとハマりやすいところなので、ちょっと確認記事を書きました。

第二引数なしで、chanをmakeした場合の挙動

ch := make(chan bool)

これは、bool型のチャネルをバッファなし(cap(ch) == 0)で作り、定義、代入しています。

ch := make(chan bool, 0)

と同じことです。

チャネルにバッファがないとどうなる?

結論から言うと、受信が発生するまですべての送信がブロックされます。 なので以下のコードは、

package main

import "time"

func main() {
    ch := make(chan bool, 0)
    // goroutineが存在しないとデッドロックする。
    go func() {
        time.Sleep(time.Second * 10)
    }()

    ch <- true
}

10秒後にデッドロックします。

これが、

ch := make (chan bool, 1)

の場合には、Status Code 0で正常終了します。

まとめ

バッファなしメモリの場合、先に受信がある。 受信がない場合送信はブロックする。

Java未経験から始めるAndroid & Kotlin入門:第一話 Android Javaの基本

blog.aimof.net

Kotlinを学ぶためにまずはJavaの基本を学びましょう。 基本スタンスは、文法はあとでいいから全体像が知りたい、です。

Kotlin学びたいんだけどなんでAndroi Javaやらにゃならんの?

Android Java先に学ばないとわけわからなかったからです。 なにこれどうなってんの?って感じ。

Javaについて

JavaJVM上で動くバイナリにコンパイルできうるコンパイル言語。 1995年生まれ。意外と新しい。 20年以上経った今でこそ様々な問題点が指摘されるが、色褪せない言語。 だいたいどんなプログラミング言語ランキングでもJavaScriptと並んでトップ3の常連です。 ちなみにJavaScriptは名前をパクられただけで大して関係ありません。 1995年当時としては画期的で、人気を博し、一躍ときの言語に Androidアプリの言語として採用されたことでさらに勢力を増しました。

とはいえ、なんだかんだ言っても20世紀の言語なので、モダンな文法を使いたい需要が高く、様々なJavaを書きやすくした言語(AltJava)が開発されている。 AltJavaは、書きやすい様々な文法を備えてい入るが結局はJavaなので、Javaを学ぶことは無駄にはなりません…たぶん。

クラスベースオブジェクト指向言語

Javaといえば、クラスベースオブジェクト指向言語です。 多分一番大事。 私はGopherで他の言語もガチガチのクラスベースオブジェクト指向やってなかったので、実は初めて。 わかってきた頃に記事書きます。

Andoridプログラミングについて

Android Javaは、普通のJavaとは違う独特のルールがあります。 下に書きます。

というわけでAndroid Javaの基本を学ぼう!

巷のプログラム経験者向けKotlin入門書は、Android Javaを知っていることが前提で書かれているものが多いたです。 (あれだけ広く使われている言語を知らないってもの問題あるので、)私みたいなJava知らない人はこそこそとJavaを勉強します。

明らかに他のサイトの方が詳しいので、わたしが困ったところだけピックアップしてググれる程度の情報を出しています。

環境構築

AndroidならAndroid Studioをインストールするだけで基本的に終わるみたいです。 まだ、躓いてないので、何かあったら追記します。

ディレクトリ構造

とりあえずAndroid Studioでプロジェクトを作ると、app内に以下の3つのディレクトリができます。

  • manifests
  • java
  • res

解説していきます。

manifests

設定ファイル。書き方は別記事で

java

ソースコード。プログラムはテスト含めここに書くみたいです。

res

resouceの略らしい。 レイアウトを指定するxmlファイルはここ。 ソースコード以外のものを入れておきます。

大量に作られるgradle関連ファイルは何者?

gradleはビルドツールです。 ビルドする際に行う手順を管理し、実際にビルドしてくれます。 昔は自動化せずにビルドしていた時代もあったかもしれませんが、Android Studioがデフォルトで使えと言ってくるので大人しく使います。 詳細は今度調べます。

Androidプログラミングの基本となるファイル

Androidプログラミングは、主に、設定を書くマニフェスト、レイアウトの指定を行うxml、処理を行うJavaのプログラムで構成されます。 Viewはxmlで指定します。 Android Studioでは、GUIxmlファイルを作れます。

命名規則はAndroidStudioのデフォルトだと、レイアウトがactivity_xxx.xml、対応するJavaファイルが、XxxActivity.javaだったはず…。 Kotlinの場合は、XxxActivity.kt。

Java名前空間は、ドメインを基準に行われています。 私のドメイン、aimof.netのsampleというクラスなら、app/java/net/aimof/sample/に配置されます。 ドメインは被らないので、同じドメイン内の名前空間はよしなにやってくれということなのでしょう。 Javaはこのディレクトリ構造のおかげで名前空間の衝突を避けています。

次回予告

早速プログラミングしてみよう!

Java未経験から始めるAndroid & Kotlin入門:序文

最近話題のKotlinによるAndroidプログラミングに入門しようとしました。

しかし、Kotlin, Android, Java全部未経験だけどプログラミングは経験ありの人向けリソースが見つからなかったので、自分で書くことにしました。 軽く探した感じだとKotlin入門書は、プログラミング初心者向けかAndroid経験者向けのどちらかが殆どみたいです。 言語特有の事象はわからないし、基礎から知りたいけど、for文の使い方習っても知っとるわい、という感じです。

この記事の対象

この記事を書く前の私のことです。

書いている人の知識詳細

  • 独学エンジニア
  • 実務1年くらい(Go, Python)
  • 主に使う言語はGo。サブでPython。RustとElixir勉強中。
  • 昔一度だけAndroidアプリを作ろうとしたが挫折した。
  • JVMが基礎から全くわからない

Kotlin習得の壁になるもの

初めての感想はKotlinによるAndroidプログラミングわけわからん、です。 しかし、わけわからんの正体をよくよく見てみるとどうも、難しいのはKotlinではなさそうであることが明らかになりました。 つまり、Java(JVM)の壁とAndroidの壁が私の前に立ちふさがっているのだ。

現時点で難しいポイントのほとんどはAndroid Javaの知識不足なので、まずはそこを学んでいきます。

最後に一応Kotlinとは何かさらっとく

ここまで読んでくださった方に講釈をたれてもしょうがないことかもしれないが、基礎的なことを確認しておきます。

KotlinはAndroidが正式サポートしている(らしい)

らしいって聞いたから始めました。Android StudioにKotlinが最初から入っているので、多分本当にサポートされているんじゃないかな。

KotlinはJetbrains製

みんな大好き?JetBrainsの言語です。私達の支払いはAndroidプログラミングをより良くするために使われていた。

KotlinはJVM上で動くAltJavaと呼ばれる言語の一つ

Kotlinは、Java Virtual Machine上で動作します。 Scalaと並べられてAltJavaと呼ばれる言語で、簡単に言えばJavaを書きやすくしたものです。

次回

そういうわけで次回からはJavaの基本を勉強します。 特にディレクトリ構造とかそのあたり。

記事リンク(忘れなければ貼る)

blog.aimof.net