2023-01-05

meishi2キーボードをカスタマイズしてレイヤー対応させてオンボードLEDも光らせてみた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

 前回、meishi2キーボードを買って、キーを押したら「こんにちは~~」と出るようにしてみたというエントリを書いてみました。

ちょっとカスタマイズを加えてみます。

キーが4つだと寂しいのでレイヤー機能を使って、もう少しいろんなことをできるようにします。そしてどのレイヤーになっているかわかるようにレイヤーの状態に応じてオンボードLEDを光らせます。

変更するのは、keymap.cで以下のように変更します。

-----------------
#include QMK_KEYBOARD_H

#define PRO_MICRO_LED_TX D5
#define PRO_MICRO_LED_RX B0

#define SW_DEF_LAY TO(_DEFAULT)
#define SW_MES_LAY TO(_MESSAGE)

//KC_Q,KC_W,KC_Eを指定していますが、使わないキーを適当に割り当てています
enum custom_keycodes {
    HASE = KC_Q,
    WATA = KC_W,
    NORI = KC_E,
};

enum meishi2_moc_layers {
    _DEFAULT,
    _MESSAGE
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  [_DEFAULT] = LAYOUT( /* Base */
    SW_MES_LAY, LCTL(KC_A), LCTL(KC_C), LCTL(KC_V)
  ),
  [_MESSAGE] = LAYOUT( /* Base */
    SW_DEF_LAY,HASE, WATA, NORI
  ),
};

void matrix_init_user(void) {
  setPinOutput(PRO_MICRO_LED_TX);
  writePinHigh(PRO_MICRO_LED_TX);
  setPinOutput(PRO_MICRO_LED_RX);
  writePinHigh(PRO_MICRO_LED_RX);
}

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  switch (keycode) {
    case HASE:
      if (record->event.pressed) {
        send_unicode_string("こんにちは~~");
      }
      return false;
      break;
    case WATA:
      if (record->event.pressed) {
        send_unicode_string("うるせ~よ");
      }
      return false;
      break;
    case NORI:
      if (record->event.pressed) {
        send_unicode_string("のりのりまさのり");
      }
      return false;
      break;
    case SW_DEF_LAY:
      if (record->event.pressed) {
        writePinHigh(PRO_MICRO_LED_TX);
        writePinHigh(PRO_MICRO_LED_RX);
      }
      break;
    case SW_MES_LAY:
      if (record->event.pressed) {
        writePinLow(PRO_MICRO_LED_TX);
        writePinLow(PRO_MICRO_LED_RX);
      }
      break;
  }
  return true;
}
-----------------

これで6つのキーが使えるようになりました。

そして、メッセージが出てくるレイヤーになっているときにはオンボードLEDが光るようになっています。


2022-12-30

meishi2キーボードを買って、キーを押したら「こんにちは~~」と出るようにしてみた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

自作キーボードにちょっと興味が出たので、お気軽に試せそうなmeishi2キーボードを買ってみました。

購入は、遊舎工房から買ってみました。

https://shop.yushakobo.jp/products/834

作り方は、以下を見ながらです。

https://biacco42.hatenablog.com/entry/2019/08/10/185624

はんだづけは、へたくそなので作ったものはお見せできませんが、はんだづけする箇所はそんなに多くないので、へたくそでもきちんと動きました。

ファームウェアは、いろいろカスタマイズできそうなCUIを使った方法で行いました。

WSL2を利用して実施しています。

基本は、上記手順に書いてある方法でよいのですが、WSL2環境だとちょろちょろコンパイルする際にエラーが出ましたが以下を参考にすることでだいたい解決しました。

http://www.neko.ne.jp/~freewing/hardware/qmk_setup_environment_build/

コンパイルはできるのですが、WSL2からファームウェアを焼くことがどうもうまくいかなかったので、ファームウェアをやくときは、windows側にQMK Toolboxを以下から取得してインストールして行いました。

https://github.com/qmk/qmk_toolbox/releases

Windows側からWSL2のファイルを見るには、

\\wsl$

と指定すれば見れるので、wsl2側で作成したhexファイルを直接指定することができます。


カスタマイズとして、キーを押したら「こんにちは~~」と出るようにします。

meisihi2のデフォルトのキーマップは

qmk_firmware/keyboards/biacco42/meishi2/keymaps/default

にあるので、この横にカスタマイズ用ファイルの置き場所を以下のような感じで作ります。

qmk_firmware/keyboards/biacco42/meishi2/keymaps/mymap

このディレクトリの中に今回は以下の3つのファイルを用意しました。

config.h

keymap.c

rules.mk

それぞれ内容は以下になります。

config.h

今回WINDWOS環境を利用するのでUNICODE_MODE_WINCOMPOSEを指定しています。

---------------------------
#define UNICODE_SELECTED_MODES UNICODE_MODE_WINCOMPOSE
---------------------------


keymap.c

---------------------------
#include QMK_KEYBOARD_H

//KC_AとKC_Bを指定していますが、使わないキーを適当に割り当てています
enum custom_keycodes {
    HASE = KC_A,
    WATA = KC_B,
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  [0] = LAYOUT( /* Base */
    HASE, WATA, LCTL(KC_C), LCTL(KC_V)
  )
};

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  switch (keycode) {
    case HASE:
      if (record->event.pressed) {
        send_unicode_string("こんにちは~~");
      }
      return false;
      break;
    case WATA:
      if (record->event.pressed) {
        send_unicode_string("うるせ~よ");
      }
      return false;
      break;
  }
  return true;
}
---------------------------


rules.mk

ユニコードが利用できるようにします。

---------------------------
UNICODE_ENABLE = yes
---------------------------


これで以下のようにファームウェアをコンパイルします。

make biacco42/meishi2:mymap

出来上がったhexファイルをmeishi2にやきます。


meishi2側は、これでOKなのですが、このままでキーを押すとWindows側にはなんか数字やらがたくさん出てくる感じなってしまいます。

日本語を受け取るにはWindows側に以下からWinComposeを取得してインストールする必要があります。


これで無事にキーを押したら

「こんにちは~~」

と出てきてくれます。

2022-09-16

rubyで住所情報から都道府県を取り出す

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

 以下のような住所情報があったとします。

東京都府中市1-2-3 道路横ビル

これから都道府県と取り出し、それ以外と分離する場合は、以下のような感じで可能です。

org = "東京都府中市1-2-3 道路横ビル"

pref = org.match(/^.+?[都道府県]/).to_s

addr = org.sub(pref,"")

prefに都道府県、addrにそれ以外が入る感じなります。

都道府県取得の正規表現に?を忘れると

prefが「東京都府中市1-2-3 道」と最長一致なってしまうのでご注意です。


※やっぱりこれだと京都府がとれないです。

pref = org.match(/^.{2,3}[都道府県]/).to_s

の方がよさそうです。


※※上記では東京都府中市が東京都府になっちゃいます。最短一致させるための?を忘れてました。

pref = org.match(/^.{2,3}?[都道府県]/).to_s

の方がよさそうです。


2022-03-23

gitでレポートな感じ

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

 gitを運用していて、だれがどれくらい変更したんだろうとか調べたくなってみました。

とりあえず以下のようなことができるかなという感じです。


誰が何回commitしたか?

git shortlog --summary -n


特定の人が何行変更したか?

find app spec -type f | xargs -n1 git --no-pager blame -f -w|grep xxx| wc -l

上記では、app、spec配下のファイルをxxxさんが変更した行数を取得している感じです。


2020-08-10

CentOS6でActiveRecord::ConnectionNotEstablished: No connection pool with 'primary' found.というエラーが出たとき。

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

 CentOS6の環境でrailsのrspecの全件試験をしたときに、試験の後半で

「ActiveRecord::ConnectionNotEstablished:No connection pool with 'primary' found.」

というエラーが連発して発生することがありました。

エラーが発生したテストケースを個別に実行するとエラーがでない感じです。

どうも調べていたらCentOS6のulimitの上限がありそうな気配でした。

以下参考です。

CentOS6のプロセス数の上限

こちらを参考に

/etc/security/limits.d/90-nproc.conf

の内容を

*          soft    nproc     1024

から

*          soft    nproc     2048

へ変更したら無事にエラーが消えました。


2020-02-23

八朔にはムッキーちゃんがおすすめ

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
冬は八朔がおいしいですね。
でも皮や房を向くのがめんどくさいですね。

そこでおすすめムッキーちゃん。
前から気になってはいましたが、amazonの配送料を無料にするために買ってみました。

思った以上にラクチンでよいです。おススメです。


2019-07-19

mysqlでソートしたデータをヘッダーつきcsvに保存する方法

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
mysqlでorder byでソートしたデータをヘッダーつきのcsvファイルとして保存する方法です。

以下のようなsqlを実行する感じです。

select 'head1','head2','head3'
union
select * from (
select col1,col2,col3 from tbl
order by col1
) as tmp
INTO OUTFILE '/tmp/sort_data.csv'
FIELDS TERMINATED BY ',';

これで

head1,head2,head3
1,bbb,ccc
2,aaa,bbb
3,ccc,aaa

みたいなcsvファイルが出力されます。

ポイントは、
・ヘッダーは、unionの前に記載
・ソートするsql文を、select * from (    ) as tmp で囲う
です。

以下を参考にしました。
https://stackoverflow.com/questions/3175312/select-union-and-order-by-in-mysql-how-to

2019-05-06

一つのDBを複数のrailsアプリから利用する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
RailsにAPIや管理画面やバッチツールなど、いろいろ機能が盛り込まれて大きくなってきて、それぞれの機能を分離したくなってきてみました。
この段階では、
app
という一つのリポジトリがある感じです。

分離自体は、役割が結構ちゃんとわかれていたので、それほど大変ではありませんでした。
この段階では、
app_api
app_admin
app_batch
のような三つのリポジトリがある感じです。

三つに別れましたが、共通のDBを利用する必要があって、分離されたアプリそれぞれにmigrationがあって、それをなんか変わったときに人手で同期させていたのですが、それぞれ独自にカラム追加したりして、だんだん見通しが悪くなってきて、ちょっと面倒になってきました。

dbを独立したリポジトリにしてよい感じで使えないかなぁと調べていたら、
というのがあることを知りました。
Ridgepoleでは、migrationのように変更を積み重ねるのではなく、最終的なテーブル定義を保持していて、dbとテーブル定義の差分を見て、dbを変更していく感じです。
dbの状態の見通しがよくなりそうだし、定義ファイルを独立したリポジトリで管理して、それぞれのリポジトリのsubmoduleとして取り込むとよさげかなと思ってみました。

というわけで、そのような環境を構築してみます。

以下を参考にしています。
https://re-engines.com/2017/05/03/370/#rails_migrateRidgepole-2

まずはGemfileに
gem 'ridgepole'
を追加して
bundle install
します。これでRidgepoleが利用できるようになります。

現在のdb定義からRidgepole用の定義ファイルを生成します。
bundle exec ridgepole -c config/database.yml -E development --split --export -o db/schemas/Schemafile

これで
db/schemas/
以下に定義ファイルが作成されます。

試しに定義ファイルの適用コマンドを試します。
bundle exec ridgepole -c config/database.yml -E development --apply -f db/schemas/Schemafile
当然、変更はありません。
念のため、test環境にも試します。
bundle exec ridgepole -c config/database.yml -E test --apply -f db/schemas/Schemafile
こちらも変更はありません。

ここまでくれば、migrationは不要になるので思い切って削除します。
rm -r db/migrate

あと、rspecのテストのために以下の変更もしたほうがよいようです。
spec/rails_helper.rb
の中の
ActiveRecord::Migration.maintain_test_schema!
の部分をコメントアウトします。
以下のような感じです。

#begin
#  ActiveRecord::Migration.maintain_test_schema!
#rescue ActiveRecord::PendingMigrationError => e
#  puts e.to_s.strip
#  exit 1
#end

とりあえず、ここでmigrationからRidgepoleに切り替えた感じになります。
Ridgepoleをより便利に使えるようにします。
以下を参考にしています。
https://qiita.com/ToqTock/items/c185a38fd4e2011ddd64

まずmigrationファイルを生成されないようにします。Myappの部分は環境にあわせて変えてください。
config/initializers/generator.rb



Ridgepoleのコマンドが長いのでdb:migrateのようにdb:applyみたいな感じを使えるようにします。
lib/tasks/ridgepole_tasks.rake



ここからdbの部分を以下のような感じで独自のリポジトリにします。
cp -pr db ~/app_db
cd ~/app_db
git init
git add *
git commit
git remote add origin app_db用リポジトリ
git push -u origin master
これで
app_api
app_admin
app_batch
app_db
の4つのリポジトリができましたが、この段階では、app_dbと同じ内容が個別にapp_apiなどにある感じです。

app_apiなどの各アプリのdbディレクトリgitのsubmoduleを利用してapp_dbのリポジトリを見るようにします。
git submoduleに関しては、以下が参考になりました。
https://qiita.com/sotarok/items/0d525e568a6088f6f6bb

cd ~/app_api
この中のdbディレクトリを削除してしまいます。
rm -r db
ここで以下のコマンドを実行してapp_dbをsubmoduleにしてdbに結び付けます。
git submodule add app_db用リポジトリ db
これでリポジトリは、以下のような感じになりました。
app_api(dbフォルダはapp_db)
app_admin(dbフォルダはapp_db)
app_batch(dbフォルダはapp_db)
app_db

これでそれぞれのアプリでdbに変更したものは、app_dbを介して、それぞれに配布できるようになりました。


2019-01-16

centos7でproxyを利用してgithubにssh接続する方法

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
sshで直接githubに接続できない環境でproxy経由で接続する方法です。

.ssh/config
に以下のような記載をすればOKです。

-----------------------
Host github.com
  HostName ssh.github.com
  Port 443
  ProxyCommand /usr/bin/ncat --proxy <server>:<port> --proxy-type http %h %p
-----------------------

これで
ssh -T git@github.com
で接続できることを確認したらgitも利用できるはずです。

以下を参考にさせていただきました。
https://qiita.com/n_slender/items/30db800aad7eb193c07e
https://qiita.com/vvisteria/items/bd748406671faae228cb

2018-10-14

redmineのパスワード管理のpluginであるVaultを入れてみた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
redmineでプロジェクト管理していて、特定のサイトとかのパスワードをメンバーで利用する必要があって、なにかよいパスワード管理方法がないかなぁと思って探したところ、
Vault
というredmineのpluginを見つけたのでインストールして使ってみました。

インストール方法は、以下のような感じです。

まずは、redmineのpluginのディレクトリに移動してください。
cd redmine/plugins/

Vaultを取得します。
git clone https://github.com/noshutdown-ru/vault

インストールを実行します。
cd ..
bundle install --without development test
bundle exec rake redmine:plugins:migrate RAILS_ENV=production

ちょっと設定をいじります。
config/initializers/assets.rb
に、以下を追加します。
--------------------------
Rails.application.config.assets.precompile += %w( zeroclipboard.js )
--------------------------

これはいらないかもですが。。。
chown apache:apache keys

ここまできたら、webサーバを再起動します。

redmineにVaultが認識されているはずなので、設定をします。
redmineの「管理」「プラグイン」「Vault plugin 設定」「Vault settings」で以下の変更を行います。
Encryption keyに適当な文字列を16文字で設定して「適用」をクリックします。
(なんか16文字でないとエラーがでました。)
また、ちょっと気になったのは、redmineをサブフォルダで運用している場合に、
※The requested URL /vault_settings was not found on this server.
という感じのエラーが出てしまいますが、正しく保存されている模様なので気にしないことにします。


Vaultは、プロジェクトごとにパスワード管理をするようなので、
利用する場合は、各プロジェクトで
「設定」「モジュール」
にKeysが出てくるのでVaultを利用する場合にはチェックします。

これでプロジェクトで利用するパスワードは、ここで管理できます。ただ、プロジェクトまたがりで使うものを、共有して管理はできないようなので、プロジェクトまたがりで使うものがある場合は、専用のプロジェクトを用意するのがよいかもしれません。
また、Vaultは、パスワード毎に見れる人を設定できる気配です。

ちょっと、こちらをしばらく使ってみようかなぁと思ってみました。

以下のサイトを参考にさせていただきました。
俺的備忘録 〜なんかいろいろ〜 Redmineのパスワード管理プラグイン「Valut」を使ってみる