忍んでいる肉球の足跡

プログラムに関連することを雑多に扱います

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が空文字列でめんどくさかった覚えがあります。

公式へのリンク

GitHub - petervanderdoes/gitflow-avh: AVH Edition of the git extensions to provide high-level repository operations for Vincent Driessen's branching model

インストール方法

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

↑の参考:

個人的に好きな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

参考:

お日誌 kensington trackballの設定周り

windowsのマシンのために整えたのでメモ

目次

  • driverをinstall & 再起動
  • 使い勝手の良い設定に修正する
  • SylphyHormとか入れていい感じにする

driverをinstall & 再起動

買ったのはこれ。
青いのは買ったけど肝心のスクロール機能や進む戻るが使えなくて投げた。
赤いのがいい。(黒も良さげ)

www.amazon.co.jp

↓ここからインストールする

www.kensington.com

※友人談で、きちんとインストールしても上下同時押しボタンが設定画面に出てこないこともあるとか。
※色々試してもらったけどよくわからない。

使い勝手の良い設定に修正する

  • 多少慣性を置くことでスクロールを正確かつ楽にする
  • ポインタの加速も付けるが、加速しすぎると使いにくいので低速
  • 下同時押しで表示しているwindowを全表示と選択ができるように
  • 上同時押し(自由枠)←今回は仮想デスクトップの移動を割り当ててみた

kensington_trackball_settings_2019-06-03_1
kensington_trackball_settings_2019-06-03_1
kensington_trackball_settings_2019-06-03_2
kensington_trackball_settings_2019-06-03_2
kensington_trackball_settings_2019-06-03_3
kensington_trackball_settings_2019-06-03_3

SylphyHormとか入れていい感じにする

ボタンが余ってないので、”仮想デスクトップを右側に移動する”と"仮想デスクトップを左側に移動する"を同時に取り付けられない。
これはループ(右端の仮想デスクトップに到達した際にもう一度右側に移動したら左端へ移動)できるようにすると解決するので、SylphyHormをインストールして設定する。

www.microsoft.com

設定内容

  • ループ設定on
  • 仮想デスクトップの移動上書きon

f:id:nukisashineko:20190603195025p:plain
SylphyHorm 設定開き方
f:id:nukisashineko:20190603194934p:plain
SylphyHorm 設定部分

お日誌 競プロむずー><

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 で 微妙に悩んだ
    • debugger使えない
    • gem install ruby-debug-ide -v '0.7.0'をIDEAでやらせたらパーミッションエラー
    • consoleから直接叩いてもmkmf.rb can't find header filesのエラーでinstallできない
      • mkmfうんちゃらはmacでも見た覚えはあったような気がするし解決したログもありそうだったけど、windowsだしと思って後回しにした。
    • 環境依存のrubyがダメならrbenvでと試した
      • rbenv install(←installだけ無い)ので、なんすかね(pengwinの最適化の辺りの話だったり?)
        • あとversion 1.0.0だったような
    • 今度、dockerとの接続は考えたほうがいいかもしれない。
    • byebugを使えって言われそう
      • (普段からIDE使ってるのでコンソール系のデバッガはほぼ触ったことがない)
      • gdbをちょっと触ったくらいなので制限時間内ではむりぽ)
  • ブログ書いてて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の立ち上がりに失敗しました)

  1. X410を起動します。
  2. wlinuxを起動します。
  3. user, passwordを設定します。

    • ※WSLと同じ仕様なら再変更が非常に面倒くさいので、一発で決めてください。
  4. 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

!動く! f:id:nukisashineko:20180927030954p:plain

右下からpluginの設定を行って再起動

とりあえず、scalaとsbt。 f:id:nukisashineko:20180927031037p:plain f:id:nukisashineko:20180927031035p:plain

create projectして、hello-worldを書く、テストも書く!

ウェーィ

LinuxのWindow」にコピペできるの素敵

spec2を利用したいので、build.sbtに追記
windowschrome→wlinuxのx401のideaへコピペ

  • コピペができる!!!

f:id:nukisashineko:20180927032539p:plain
f:id:nukisashineko:20180927032551p:plain

WindowsLinuxを行き来するプログラムは大概コピペが最初できなくてつらみがあるので、これはうれしい。 なんて言っても、試しのコーディングの際にササッとコピペできるのがいい。

sbt shell, test run, debugが一通り動くことを確認

f:id:nukisashineko:20180927033021p:plain f:id:nukisashineko:20180927033011p:plain f:id:nukisashineko:20180927033012p:plain f:id:nukisashineko:20180927033015p:plain

githubで適当にリポジトリを作ってPush

省略。

動作中のメモリとか

16GBの約10%で1.6GBほどの消費。
プロジェクト作成時にscala本体のsource codeも持ってきたのでそれのせいで重くなってしまった感。

before:

f:id:nukisashineko:20180927033228p:plain

after:

f:id:nukisashineko:20180927033235p:plain

感想・総評

昔の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で書けないかなと考えてしまったせい。

  • pythonのdict::updateは返り値を返さない仕様
  • pythonのlambdaが一行しか中身を書けない

だから下記のように冗長になってしまって、見た目がちょっとやだったんだよね。

def tmp(dict, x):
    dict.update(x)
    retrun dict
reduce(tmp,[{1: 2}, {3: 4}, {5: 6}], {})

まあ、そういう融通の効かないところが好かれる理由だとは思うのですけどね。