MySQLでユーザーを作成し特定のテーブルのみの権限を与える

以下のような処理をしています。

  • ユーザー名userをパスワードpasswordでどこからでも接続できるようにする
  • ユーザー名usertable_nameへの全権限を付与する
CREATE USER 'user'@'%' IDENTIFIED BY 'password'
GRANT ALL ON table_name.* TO 'user'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

CREATE USER は実行せずいきなりGRANT ALLからでもユーザーが作成されたのを観測できたので検証したい。

削除については下記のようにする

DROP USER user;

接続先によって権限を変えるというのは同じユーザーでも運用環境からの接続の場合はこうするとか言った時に使えそうだが、運用環境との帳尻合わせも大変なのであんまりやらないか。

接続元の遮断はここでやるよりファイアウォールでやることが多い。

iOSのiMessageに相当するAndroidのアプリ「ハングアウト」

screenshot

LINEの代替が欲しい。iPhone時代はLINEが友人用、iMessageは家族用とで使い分けていたのですが、Androidに機種変してからどうしていいかわからずLINEに寄せていました。

代替としては

  • ハングアウト
  • メッセージ

が見つかりましたが、メッセージはSMS専用と言った所で、ハングアウトはLINEと同じ(iMessageと同じともいえる)機能を持っていて、大抵は上位互換だけど、一部機能が足りないイメージでした。以下にまとめました。

ハングアウトの良い所・悪い所

これはそのものズバリなのでまとめます。

良い所

  • LINEに比べて通知が速い
  • LINEでは画像が小さく圧縮されるがハングアウトはされない(元サイズのまま?)
  • LINEに比べてログインがしやすい
  • Chrome拡張としてPCで使う時、頻繁にログインさせられなくて済む
  • 既読が相手にバレない
  • 現在入力中が相手に伝わる

悪い所

  • ハングアウト使ってる人が少ない
  • 画像の共有が心配性な人にとっては怖い
  • 既読が分からない
  • 現在入力中が相手にバレる

という感じなんですが、一部気になった所は深く調査してみました。

ハングアウトにアップロードした画像は公開URLが発行される

LINEの場合はアップロードした画像は https://obs-jp.line-apps.com/talk/m/download.nhn?oid=123 のようなURLに配置され、ログインしていないとダウンロードできなかったので若干安心です。(ただし画像が劣化するので、友人間で写真を交換する時に劣化したものを持ち回すことになるのが辛い。)

Google ハングアウトはアップロード画像のサイズは元サイズのままになるので気持ちよく画像が交換できますが、 https://lh3.googleusercontent.com/xxxx/xxxxx といったURLに配置され、ログインせずとも閲覧が可能でした。URLは一意のものだと思うので、特定されることはないと思いますが、奇跡が起きると見られるかもしれない。

ハングアウトにアップロードされた画像はハングアウトから消すことはできませんが、アルバムアーカイブから消すことができます。なので、一度共有したあと気が済んだらここから消す運用にすれば安心です。

画像と動画以外共有できないかも

滅多に使うことはないですが、LINEだとPDFとかzipファイルとかアップロードできますが、ハングアウトは画像と動画しかアップロードできないかも。

ただ、Google Driveからファイル共有機能があるので、単にそれを使えばいいのかもしれないですね。LINEでファイル交換するのはちょっとやりすぎかな。

おわり

結論としてはハングアウトの特性を理解さえしてしまえば、特に問題なく使えそうなことがわかりました。LINEしか使っていないとLINEに範疇で何かをしようとしてしまいがいだし、写真の交換にも難があったので、ハングアウトもこれからは使っていこうと思います。

RustでCRC32を計算し16進数文字列を得る

PNG画像を自力で生成するにあたってCRC32の計算が必要らしい。で、RustでやるのでCRC32を計算する方法をメモしておきます。

cargo add crc

したら、後はこのように得ることができる。

assert_eq!(crc::crc32::checksum_ieee(b"hoge/fuga/piyo"), 0x8e8b9fcd);

これを to_string() した場合、10進数の文字列となる。結果を16進数文字列で得たい場合は書きのようにする。

assert_eq!(
    format!("{:02X}", crc::crc32::checksum_ieee(b"hoge/fuga/piyo")),
    "8E8B9FCD"
);

参考

Windows 10でUSキーボードを使えるようにして日本語入力の切り替えを行う

USキーボードに対応させる

  1. 設定から「言語」を開く
  2. 日本語をクリックする
  3. オプションをクリックする
  4. レイアウトを変更するをクリックする
  5. USキーボードを選択
  6. PCを再起動する

日本語と英語を切り替える

LinuxではSuper+Space、MacではCmd+Spaceで切り替えられますが、WindowsのUSキーボードで切り替える場合は

Alt + `

で切り替えられます。

Rustのegg-modeでTwitterに投稿する

最初Shellで書こうと思ったがだるかったので結局ライブラリ使った。egg-modeは0.14から現行のFutureに対応しているのでそれを使いたいが、まだリリースされていないのかな。Gitから最新のソースコードを利用することにしました。

Cargo.toml

[dependencies]
tokio = { version = "0.2", features = ["full"] }
futures = "0.3.4"
egg-mode = { git = "https://github.com/QuietMisdreavus/twitter-rs.git" }

main.rs

#[tokio::main]
async fn main() -> Result<(), ()> {

    let consumer = egg_mode::KeyPair::new(
        "consumer_token_key",
        "consumer_token_secret",
    );

    let access = egg_mode::KeyPair::new(
        "access_token_key",
        "access_token_secret",
    );

    let token = egg_mode::Token::Access { consumer, access };

    use egg_mode::tweet::DraftTweet;
    let draft = DraftTweet::new("test");
    draft.send(&token).await;

    Ok(())
}

Twitter APIのアプリケーションリクエストをシェルで送る

その辺の普通のライブラリを使ってもいいのですが

  • 機構を隠蔽するのでなぜ動いているのか理解できない
  • ライブラリの不具合やバージョンアップで動かなくなる
    • 直接APIをコントロールしていればAPIの廃止まで放置できる

以上からシェル芸でやることにしました。

アプリケーションのリクエストを発行する

screenshot

Issuing application-only requests という項目にある通信内容を再現しているだけです。ここではアプリケーションの認証なので、ユーザーと結びついていないので投稿などはできません。

アクセストークンの取得

まずはアプリケーションのアクセストークンを得ます。レスポンスはJSONです。もしアクセストークンのみを変数に格納する場合はjqを使えば得ることができます。

BASIC=`echo -n "[コンシューマーキー]":[コンシューマーシークレットキー] | base64`
BASIC=`echo $BASIC | sed 's/\n/ anko /g'`

curl -v https://api.twitter.com/oauth2/token \
  -H "Authorization: Basic $BASIC" \
  -H 'Content-Type: application/x-www-form-urlencoded;charset=UTF-8' \
  -X POST \
  -d grant_type=client_credentials

ユーザーのタイムラインを取得

先程取得したアクセストークンを使ってユーザーのタイムラインを取得できます。

# curl "https://api.twitter.com/1.1/statuses/user_timeline.json?count=100&screen_name=[ここにスクリーンネーム]" \
# -H "Authorization: Bearer [アクセストークンをここに]" \
# -X GET

ツイートを投稿する

これが参考になったけど結構大変だった。シェルはやめとこう。

https://qiita.com/piroor/items/a999eeef9a67283b1e56

セサミをAPIでコントロールする

セサミ miniというのを自宅で使ってるんですが、これはAPIでコントロールすることができます。前提として別売りのWi-Fiアクセスポイント というのが必要です。(Wi-FiアクセスポイントはWi-Fiとセサミの仲介機みたいなやつです。)

CANDY HOUSE Developer Referenceというところに全部まとまってはありますが、基本やりたいことは鍵を開けたいだけです。操作にはAPIキーが必要で、それはCANDY HOUSE Dashboardから得られます。以下はサンプルコードです。

疎通を確認

curl https://api.candyhouse.co/public/ \
  -H "Authorization: xxxxx"

セサミのデバイスリストを取得

curl https://api.candyhouse.co/public/sesames \
  -H "Authorization: xxxxx"

指定したデバイスのステータスを取得

curl https://api.candyhouse.co/public/sesame/xxxxx \
  -H "Authorization: xxxxx"

指定したデバイスの解錠をする

curl https://api.candyhouse.co/public/sesame/xxxxx \
  -H "Authorization: xxxxx" \
  -H "Content-Type: application/json" \
  -X POST -d '{"command":"unlock"}'

セサミは解錠後一定時間経つと自動で鍵を閉められるので閉める処理はいらんかな。

おわり

JSONでリクエストして操作ができるので、PHPだろうとJavaだろうとRubyだろうと好きな言語で操作できますよ。ぜひやってみてください。