git flow avhをうまく使う方法
概要
git flow avhというものを知っていますか?
git flowではできなかったbranchのrename, delete, rebaseができるようになったfork です。 元々のgit flowではbranchのdeleteやrebaseは直接gitコマンドを叩かなければいけませんでした。
git flow avhはbrewではデフォルトで拾われてなかった気がします。 ubuntu 18.04からはapt install git-flowとするとgit flowではなく、git flow avhがインストールされるようになったようです。
ただ、windows wsl2環境だとaptで入れたgit flow initのbranch prefixのdefaultが空文字列でめんどくさかった覚えがあります。
公式へのリンク
インストール方法
cloneしてbinのpathを通す
git clone -b master git@github.com:petervanderdoes/gitflow-avh.git
お得な使い方
git flow で作成したbrachを消したい時
git flow feature delete xxxxxx
git flow で作成したbrachをrenameしたい時
git flow feature rename xxxxxx yyyyyy
git flow で作成したbranchがリモートでコンフリクトしたので現在のdevelopからの枝としてrebaseしたい時
git merge develpよりもコンフリクト解消が楽なのでおすすめ。
git flow feature rebase xxxxx
githubのpullrequest reviewのフローと併用してgit flowをローカル環境で使っているときに、merge済みのブランチ自動削除
git fetch origin -u develop:develop master:master && git checkout develop && git fetch -p && for branch in `git branch -vv | grep ': gone]' | awk '{print $1}'`; do git branch -D $branch; done
↑の参考:
- git - How to pull into not-the-current-branch? - Stack Overflow
- git - Remove tracking branches no longer on remote - Stack Overflow
個人的に好きなfeatureの命名規則
git flow feature start <topic name>/id/<github issue number>
# その他
- jetbrainsのgit tool的なやつを使うと、merge, rebase時のコンフリクト自動解消できる
- ただmergeだと自動解消の精度が低いため、git flow rebaseを使うのが便利だよ。
※雑作成なので誤記があるかも、記事書く気力が
RailsでPromisesやFutureを使う方法
共通して注意すること
- 並列処理中に動的クラス解決させない
- value!を使う
並列処理中に動的クラス解決させない
Concurrent::Promises.future
内部で動的クラス解決を行おうとすると、
Circular dependency detected while autoloading constant
というエラーが出てしまう。
回避策としては事前にRails.application.executor.wrap
の前でMyClass
を宣言して動的クラス解決を事前にさせること。
MyClass Rails.application.executor.wrap do Concurrent::Promises.future do MyClass.async_something end end
value!を使う
参考のところにも書いてあるが、value!
を利用しないとエラーハンドリングから漏れることに注意。
Promises.future
※プロセス数管理は勝手にやってくれるやつ
※eachだか lazyだかで大量に回そうとするとプロセスが作れなくなるのかセグフォするので注意↓
※(version ruby 2.5.3, rails 5.0?)
Rails.application.executor.wrap do Concurrent::Promises.future do :async_something end end ActiveSupport::Dependencies.interlock.permit_concurrent_loads do Concurrent::Promises.zip(*tasks).value! end
Future.execute
※ こちらはプロセス数に個数制限を掛けられるのでeachやlazyで雑に回せる
thread_pool = Concurrent::FixedThreadPool.new(20) Rails.application.executor.wrap do Concurrent::Future.execute({ executor: thread_pool }), do :async_something end end ActiveSupport::Dependencies.interlock.permit_concurrent_loads do executors.map(&:value!) end
参考:
お日誌 必死チェッカーの更新とか
Tampermonkeyのスクリプトで「Togetterの必死チェッカー」をずいぶん昔に作って放置していたけど、動かなくなっていたみたいだったから修正したりした。 li → divだけ直せば良かったぽい。 greasyfork.org
お日誌 kensington trackballの設定周り
windowsのマシンのために整えたのでメモ
目次
- driverをinstall & 再起動
- 使い勝手の良い設定に修正する
- SylphyHormとか入れていい感じにする
driverをinstall & 再起動
買ったのはこれ。
青いのは買ったけど肝心のスクロール機能や進む戻るが使えなくて投げた。
赤いのがいい。(黒も良さげ)
↓ここからインストールする
※友人談で、きちんとインストールしても上下同時押しボタンが設定画面に出てこないこともあるとか。
※色々試してもらったけどよくわからない。
使い勝手の良い設定に修正する
- 多少慣性を置くことでスクロールを正確かつ楽にする
- ポインタの加速も付けるが、加速しすぎると使いにくいので低速
- 下同時押しで表示しているwindowを全表示と選択ができるように
- 上同時押し(自由枠)←今回は仮想デスクトップの移動を割り当ててみた
SylphyHormとか入れていい感じにする
ボタンが余ってないので、”仮想デスクトップを右側に移動する”と"仮想デスクトップを左側に移動する"を同時に取り付けられない。
これはループ(右端の仮想デスクトップに到達した際にもう一度右側に移動したら左端へ移動)できるようにすると解決するので、SylphyHormをインストールして設定する。
設定内容
- ループ設定on
- 仮想デスクトップの移動上書きon
お日誌 競プロむずー><
atcoder.jp ↑これを解いていた。
お気持ち
- 時間の最初からやっていたのに、A問題すら時間制限以内にクリアできなかったので悲しい
気付きとか
- 使わないnのwarningの消し方で_で置き換えるのを思い出すのが遅かった。
- 文字列で、移動だからこれ正規表現だなって発想までは良かった
/#{2}/
が現れたらダメはすぐに気づいた- 入れ替わりが発生する事例は
/\.{3}/
も無いと行けないと言うも途中で気づいた - 境界値、特にcuplicate_zone_checkの±1のところで躓いていた
- 結局、この±1の発想は終了後に他人の回答を読んで気付きを得た
- 愚直に再帰シュミレートしたら?というのはtimeoutさせられそうな気がしたからやめた
- (けどどうだったんすかね、試してみるのは有りだったかも)
- self.inputとして書いたせいか、exitしないと二度inputが呼ばれる現象があって悩まされた
- これが実行時エラーの原因 その一
- やっぱ、static関数に副作用を持たせるのは良くない
-
ruby agc034_a.rb < sample_01.txt
- 入力は文字列だぞ!!!!
- specで書いてる時に気分が完全に数値だったので忘れてた。
- 実行時エラーの原因そのニ
- pengwin で 微妙に悩んだ
- ブログ書いててgist-itを見つけたので便利
時間制限終了時点のコードへのリンク
Submission #5765996 - AtCoder Grand Contest 034
↑Specのテストで満足して、実際にtxt読ませるテストしてなかったら入出力で落ち続けてて、実行時エラーばっかりなのウケる……ウケる。
答え公開済みの延長戦後のコード↓
- ※更にリファクタするなら
- ※main, input, outputの辺りの副作用をどうにかしたい
- ※specコピペ多いのでletやshared_example, shared_contextとかその辺使える気はする
- ※コメントもdoc commentも足りないので増やす、lintで揃える
- ※あ、have_duplicated_zone_calcのnon_duplicated_zone_checkは区間区切る必要ないっすね、一つにまとめるとduplicated_zone_checkの呼び出しで両方呼び出さなきゃいけなくなりそうな、んー。
噂のwlinuxでidea動かしてscalaでhelloworldする。
window側で必要な要素です
計 ¥1,580
wlinux後の初期設定とかいろいろ
※ Hyperを利用してwlinux.exeを叩くと失敗するので注意です。
(少なくとも初期設定のWindow\bash.exeから叩いたらGUIの立ち上がりに失敗しました)
- X410を起動します。
- wlinuxを起動します。
user, passwordを設定します。
- ※WSLと同じ仕様なら再変更が非常に面倒くさいので、一発で決めてください。
user, passwordの設定以降は次のように行いました
cd $HOME # 誤入力・Tab補完時にうるさいベル音の削除(重要) sudo sed -i "s/# set bell-style none/set bell-style none/" /etc/inputrc # aptでinstallするものとか(結構時間がかかります) sudo apt install openjdk-8-jdk gedit bash-completion -y # git flow avhのインストール wget --no-check-certificate -q https://raw.githubusercontent.com/petervanderdoes/gitflow-avh/develop/contrib/gitflow-installer.sh && sudo bash gitflow-installer.sh install stable; rm gitflow-installer.sh # completion(tab補完の調整) wget https://raw.githubusercontent.com/bobthecow/git-flow-completion/master/git-flow-completion.bash -O $HOME/.git-flow-completion.bash cat >>$HOME/.bashrc <<EOF if [ -f /etc/bash_completion ]; then . /etc/bash_completion fi EOF cat >>$HOME/.bashrc <<EOF if [ -f $HOME/.git-flow-completion.bash ]; then . $HOME/.git-flow-completion.bash fi EOF #git config git config user.name "xxxxx" git config user.email "xxxxx@example.com" #github系の調整 mkdir -p $HOME/.ssh/github/ ssh-keygen -t rsa -b 4096 -C "xxxxx@example.com" # ${HOME}/.ssh/github/id_rsa を絶対パスで指定 cat >>$HOME/.ssh/config <<EOF Host github.com HostName github.com IdentityFile ~/.ssh/github/id_rsa User git EOF chmod 600 $HOME/.ssh/github/id_rsa chmod 600 $HOME/.ssh/config gedit $HOME/.ssh/github/id_rsa # pbcopy無いのでコピペ # githubのアカウントにsshkeyを追加する部分は省略 # giboのインストールも省略
ideaの設定編
お好みのjetbrainsのLinux版を拾ってきて展開してideaを起動する。
tar zxvf ideaIU-2018.2.4.tar.gz ./idea-IU-182.4505.22/bin/idea.sh
!動く!
右下からpluginの設定を行って再起動
とりあえず、scalaとsbt。
create projectして、hello-worldを書く、テストも書く!
ウェーィ
「LinuxのWindow」にコピペできるの素敵
spec2を利用したいので、build.sbtに追記
windowsのchrome→wlinuxのx401のideaへコピペ
- コピペができる!!!
WindowsとLinuxを行き来するプログラムは大概コピペが最初できなくてつらみがあるので、これはうれしい。 なんて言っても、試しのコーディングの際にササッとコピペできるのがいい。
sbt shell, test run, debugが一通り動くことを確認
githubで適当にリポジトリを作ってPush
省略。
動作中のメモリとか
16GBの約10%で1.6GBほどの消費。
プロジェクト作成時にscala本体のsource codeも持ってきたのでそれのせいで重くなってしまった感。
before:
after:
感想・総評
昔のWindowsでは考えられないくらいに開発環境(パッケージ管理・UNIXコマンド・パイプ処理・UX)してる。
desktopで動かしたので、オーバーヘッドによる速度の低下も(aptからの展開時を除けば)余り気にならなかった。
人権のないノートブックからでもコマンドライン操作はほぼ気にならないと思う。
WebServer立ててないので、IP周り(というかファイヤーウォール周り)がどうなってるのかがわからないのでまだ様子見ではある。
1.5kなら電子小物代にもならないので、少しでも気になる人は買っておくと吉かもしれない。
後々7kで口に指をくわえることになるくらいなら、今買ったほうが絶対得。
(↑7k高すぎてlinux入れとけばいいやってなりがち)
chrome bookのOP1も気になってたけど、こんだけWindowsで動くなら割とどっちでもいい気がしてきた。
その他
今回作ったリポジトリ
GitHub - nukisashineko/scala_hello_world_from_wlinux
参考
pythonでdictをmergeしようとして悩んだ
正解
dict((x,y) for x, y in tuples) dict((x,y) for x, y in [{1: 2}, {3: 4}, {5: 6}].iterateitems())
悩んだ理由
reduceで書けないかなと考えてしまったせい。
だから下記のように冗長になってしまって、見た目がちょっとやだったんだよね。
def tmp(dict, x): dict.update(x) retrun dict reduce(tmp,[{1: 2}, {3: 4}, {5: 6}], {})
まあ、そういう融通の効かないところが好かれる理由だとは思うのですけどね。