JUNのブログ

JUNのブログ

活動記録や技術メモ

usermod -G をしてしまい sudo が使えなくなったので直した

wiresharkを入れようと思ってサイトのコマンドをコピペしてたらいつのまにか usermod -Gをしてしまっており root権限が必要なすべて作業ができなくなった。

usermodでグループを追加するのは危険
ここにも書いてあるとおり、usermod -Gをしてしまうと既存のグループを上書きしてしまうので絶対にやってはいけません。この記事は私のようにすでにやらかしてしまった人のためのものです。 ちなみに安全なグループの追加方法は usermod -aです。

環境

Linux MintUbuntuベースのディストリビューションなのでUbuntuの方も同じようにいけます。

直し方

万が一のために大事なデータはUSB等の別の場所に保存してから作業をしてください!

起動時にEscキー(Shiftキーの場合もあり) を押しながら起動し、grubを起動。そしてリカバリーモードがあるのでそれを選択。

そこでまず fsckを選択して read/writeモードでマウントし直す。

そして次に root Drop root shell prompt でrootログインして、 gpasswd -a user_name sudo とする。

su user_nameで自分のユーザーに切り替えて、sudo cat /etc/groupなどをやってみて確認。

参考にしたリンク

MySQLで突然出てきたエラー"Data too long for column 'hogehoge' at row 1"" を直す

追記

---

本来ははこっちの直し方でいけます

 

MySQLを使っている時に、ファイルへのパスが100文字超えるとエラーが起きるが、それは*FileField*の*max_length*を指定すれば直る [Django - Increase FileField length](https://stackoverflow.com/questions/26575635/django-increase-filefield-length)<br>

でも、この記事の内容はわしがちょくちょく見返すので残しておく

 

環境

Djangoのデータベースを sqlite3 から MySQL に移行したら起きた問題。

Data too long for column 'hogehoge' at row 1

これはなんなのかというと、「桁数あふれてるよー」ってMySQLが言ってる。
で、なんでこんなことになっているかというと、MySQLのデフォルトの設定がオーバーフローしたらエラーを返すようになっているから。だからそれを変更すればいい。

これの直し方は

$ sudo vim /etc/mysql/my.cnf

my.cnfの [mysqld] にこれを書き加える

[mysqld]
sql_mode=''

あとは再起動すれば

$ sudo /etc/init.d/mysql restart

これで直りました。

 

MySQLとDjangoをつなげる手順

この記事はそもそもMySQLすらダウンロードしてない人向けです。

Djangoのプロジェクト自体は作成済みを想定しています。

環境

  • OS: LinuxMint 18.3
  • Django == 2.0.6

各種インストール

MySQLをインストール

$ sudo apt-get install mysql-server

インストール途中にパスワードを設定するように求められるので設定してください。

DjangoMySQLをつなげるPyMySQLをインストール

現時点で(2018/06)デフォルトでインストールされる PyMySQL==0.7.9 は致命的なバグが含まれているためこちらではバージョンを指定してインストール。
バグについてはこちら

$ pip install PyMySQL==0.8.0

MySQL周りの設定

日本語(UTF-8)

文字化け対策です。

$ sudo vim /etc/mysql/my.cnf  # MySQLの設定ファイルを変更する

以下を書き加える

[mysqld]
character-set-server=utf8
skip-character-set-client-handshake
default-storage-engine=INNODB

[mysqldump]
default-character-set=utf8

[mysql]
default-character-set=utf8

MySQLを再起動する

$ sudo /etc/init.d/mysql restart

ログイン

$ mysql -u root -p

データベースの作成

mysql > create database test_db;

ユーザーの追加

ユーザー名:testuser パスワード:password ホスト名:localhost

mysql > create user `testuser`@`localhost` IDENTIFIED BY 'password';

ユーザーにデータベースの操作権限を付与

対象:testuser@localhost 対象のパスワード:password 操作できるDB名:test_db

mysql > grant all privileges on test_db.* to testuser@localhost IDENTIFIED BY 'password';

ログアウト

mysql > \n

これでMySQL側の設定は完了です。

Django側の設定

settings.pyを編集する

settings.pyの DATABASE の部分を書き換える

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test_db', # DB名を設定
        'USER': 'testuser', # DBへ接続するユーザIDを設定
        'PASSWORD': 'password', # DBへ接続するユーザIDのパスワードを設定
        'HOST': 'localhost',
        'PORT': '',
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
        },
        'TEST': {
            'NAME': 'test_sample'
        }
    }
}

PyMySQLを使えるようにする

manage.pyにこれを書き加えてください。

import pymysql
pymysql.install_as_MySQLdb()

書き加える場所はどこでもいいと思います。私は import の下に書き加えてます。

終わり

これで

$ python manage.py makemigrations
$ python manage.py migrate

とすれば終わり!!

参考リンク

codelab.website

qiita.com

qiita.com

Django2.0とMySQLを繋げようとするとエラーが起きる(PyMySQL)

環境

このサイトに沿ってMySQLDjangoを繋げようと思ったら

django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.3 or newer is required; you have 0.7.9.None

と言われてできない。

これはPyMySQLのバグで公式でも報告されている。Compatibility with Django 2.0 #610

で、これは既に解決されており、PyMySQL==8.0.0では解決されている Bump MySQLdb version from 1.2.6 to 1.3.12 #623

なので、現在(2018/6)pipでデフォルトでインストールされる PyMySQL==0.7.9 ではなく PyMySQL==0.8.0 を入れればいい。

pip install PyMySQL==0.8.0

これでいけるはず。

ThinkpadX1Carbon でOpenCVでビデオキャプチャしようと思ったら緑画面が出てきた問題

多分これは Thinkpad 買うときにIRカメラつけた人だけ起こる問題。

import cv2

cap = cv2.VideoCapture(0)

while 1:
    ret, img = cap.read()

    cv2.imshow('img', img)
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break

cap.release()
cv2.destroyAllWindows()

このプログラムでビデオキャプチャしようと思ったら何故か緑色の画面が出てきた

f:id:JUN_NETWORKS:20180623211241p:plain

実はこれカメラじゃなくて、IRカメラが動いています。その証拠にプログラム実行中はカメラの横の赤いLEDが光っていると思います。

で、これの解決方法は簡単で、

cap = cv2.VideoCapture(1)

とすれば直ります。

要は、この cv2.VideoCapture(0)0/dev/video0 を指していて、video0はIRカメラになっているので、 /dev/video1 は普通のカメラなのでそっち指定してあげればいいだけの話

これに気づかなくて30分くらい消費した。

あ ほ く さ

Linux でホストネームを変える方法

やりたいこととしては、ターミナルとかで表示されるここを変えたい

jun@OldHostName ~$

@OldHostName の部分ですね。
ここはホストネームとか呼ばれてる部分で、デフォルトだと自分のパソコンの型番みたいな感じになってると思います。

ここをこんな感じに変えます。

jun@NewHostName

やり方

ターミナルでsudo vim /etc/hostnameと実行すると1行目に自分の今のホストネームが書かれていると思うので、それを消して新しいホストネームを入力し、保存します。

次にsudo vim /etc/hostsで2行目に古いホストネームがあると思うので、それを消して新しいホストネームにします。 これをしないとこれからコマンドを実行するたびにsudo: ホストxxxの名前解決ができませんと言われます。

でも、まだこの状態じゃホストネームが古いまま表示されてると思うので再起動します。そして、ターミナルを開いたら新しいホストネームに更新されてると思います。

Linux Mint(Cinnamon) で Touchpad gestures を使えるようにした

したいこと

初期のLinux Mintの設定ではタッチパッドを有効にしてもせいぜい左右クリックとスクロールくらいで、これじゃとても使い勝手が悪い。
Linux Mintを使う前までWindows10を使ってた私としてはぜひともタッチパッドジェスチャーを使いたい(タッチパッドジェスチャーの本家は多分Mac)

↓Windows10タッチパッドジェスチャー https://cdn.arstechnica.net/wp-content/uploads/2015/07/Task-View-1.png

目標到達レベル

  • 3本指で上にスワイプすると今のワークスペースで開いてるウィンドウを表示する
  • 3本指で下にスワイプするとデスクトップを表示。もう一度下にスワイプするとさっき開いていたウィンドウを表示
  • 3本指で左右にスワイプするとブラウザのページを戻ったり進んだりする。
  • 4本指で左右にスワイプするとワークスペース切り替え。

環境

LinuxMintUbuntuベースのディストリビューションなので、多分Ubuntu環境でも同じやり方でできると思います。

各種パッケージのインストールと設定ファイルの作成

# 自分のユーザーをinput groupに入れる
sudo usermod -aG input $USER

# 必要なライブラリを入れる
sudo apt-get install xdotool wmctrl libinput-tools

# Clone and install
git clone http://github.com/bulletmark/libinput-gestures  
cd libinput-gestures  
sudo ./libinput-gestures-setup install  

これでlibinput-gesturesが入ったはずです。

試しにlibinput-gestures-setup startとターミナルに打ち込んで実行して、3本指で上下に動かしてみてください。ワークスペースが切り替わればちゃんと実行できてます。

次にlibinput-gestures内でデフォルトで読み込まれるカスタム設定を作成します。 以下のコマンドをターミナル上で実行してください。
touch ~/.config/libinput-gestures.conf

中身は以下のようにします。

gist.github.com

保存したら、ターミナルを開いて、libinput-gestures-setup restartを実行し、システムファイルを再読み込みします。その後、動作を確認し、思い通りの動作ができていればOKです。

補足

libinput-gestures.confを書き換えることでいろいろジェスチャーを追加できます。

もし、反応が悪かったりしたら設定の [マウスとタッチパッド] でタッチパッドの感度を変更してみたりすると改善するかもしれません。

libinput-gestures-setup autostartを実行すると起動時にlibinput-gesturesが自動で起動するようになります。詳しくはここを見てください

追記

(2018/5/6) 私の環境では3本指でのジェスチャーの反応がとても悪く、逆に4本指でのジェスチャーはきちんと反応したので、ウィンドウの表示とデスクトップの表示を3本指ではなく4本指でのジェスチャーに変更しました。 このように細かい部分や気になった部分は自分でconfigファイルをいじって調整してみてください。

参考にさせてもらったサイト