jubo的学習記録

日々自分の技量のなさに悩みながら這いつくばって頑張っているエンジニアが勉強・学習したことの記録です。

GitLFSで404エラーが出た

ことの発端

グループ開発でGitLFSを利用しておりました。

ある時メンバーから「sourcetreeでブランチを切り替えられない」ということを言われました。 masterブランチからdevelopブランチに checkout したかったようです。

こんなエラーが出ていました。

git -c diff.mnemonicprefix=false -c core.quotepath=false checkout -b develop --track origin/develop
Downloading image1111.png (2 KB)
Error downloading object: image1111.png (bcfc16): Smudge error: Error downloading image1111.png (***************************************************************************): 
[***************************************************************************] 
Object does not exist on the server: [404] Object does not exist on the server

Use `git lfs logs last` to view the log.

error: external filter 'git-lfs filter-process' failed
fatal: image1111.png: smudge filter lfs failed

確認のためコマンドラインでcloneしてみると下記エラーになりました。

[***************************************************************************] 
対象がサーバー上に存在しません: [404] 対象がサーバー上に存在しません

Errors logged to image/.git/lfs/logs/20181120T181049.624332.log
Use `git lfs logs last` to view the log.
error: external filter 'git-lfs filter-process' failed
fatal: image1111.png: smudge filter lfs failed
warning: Clone succeeded, but checkout failed.
You can inspect what was checked out with 'git status'
and retry the checkout with 'git checkout -f HEAD'

下記対応方法を見つけ、そのメンバーには対応してもらいました。

Git LFS でうまく clone や pull ができないときにバイナリファイルのダウンロードをスキップする

smudgeエラーが起きるのでそのエラーをSkipするだけで一時対応はできました。 しかし、あくまでも一時対応のため、グループ全員に行ってもらう必要があります。

解決方法

根本的解決ができた方法も記録しておきます。

  1. smudgeエラーをSkipできる状態にする

    git lfs install --skip-smudge

  2. pullする

    git pull

    git lfs pull

  3. 問題のファイルを削除する(今回の場合は image1111.png

    rm image1111.png

  4. 削除したファイルを再度追加する

  5. 再度pushする

smudgeエラーが発生するようなファイル破損状態になったことが原因のようです。

解消方法は破損ファイルの削除で対応することができました。

IntelliJをインストール

sbtについてのチュートリアルを読み終わって気がつきました。
scala書いてないじゃん…orz

scalaというプログラミング言語の勉強を進めたいのに、 ビルドツールに時間をさいてしまった。

sbtについては簡単に把握しやすい記事があったので、 今後はそちらを参照するようにしたいと思います。

qiita.com

気を取り直してIntelliJをインストールしました。
無料のやつ。

www.jetbrains.com


次こそコードを書くぞ!

sbtシェルについて

基本

今回の学習:sbt Reference Manual — 実行

sbtを実行するには、プロジェクトディレクトリに移動してsbtと打つ。

cd practice_scala/hello/
sbt

これで「sbtシェル」が実行される。

実行後は下記の3つの操作になるみたい。

> compile
> run
> exit

上から順に、

バッチモード

sbtコマンドに引数を渡したらバッチモードになり、「"“」で囲めば1つの引数扱いになるとのこと。

例:$ sbt clean compile “testOnly TestA TestB”

ビルドが遅くなるらしいですが、実際に使ってみてのお楽しみとしてとっておきます。

継続的ビルド・テスト

ソースファイルを保存すると自動でコンパイルしてくれる仕組みがあるようです。
初心者なので慣れるまで手動でやっていきます。

なれたら試すsbt Reference Manual — Triggered Execution

その他、頻出コマンドが紹介されていましたが、今見ても頭に入らないので、skipします。

プロジェクトのディレクトリ構成

ディレクトリ構成についての説明がありましたので、簡単に読んでおきます。
sbt Reference Manual — ディレクトリ構造

かいつまんでメモ。

  • ソースコードは「src/main/」に作成する(今回の例だと practice_scala/hello/src/main/)
  • 「src/」ディレクトリにディレクトリを作成されても無視されるので注意
  • ビルドの定義ファイルは「build.sbt」に記載する(今回の例だと practice_scala/hello/build.sbt)
  • プライグインなどは「project/」に追加する(今回の例だと practice_scala/hello/project/)
  • ビルドした成果物は「 target/」に追加される(今回の例だと恐らく practice_scala/hello/target/)
  • バージョン管理する際は「.gitignore」に「target/」を追加すると便利らしい(今はいいかな)


恐らくの部分は今後勉強して確認後修正

sbtで「hello world」

今回の内容はこちらのチュートリアルsbt Reference Manual — Hello, World)です。

とりあえず、sbtのインストールが完了したので、
下記コマンドを実行して練習用ディレクトリ(今回はpractice_scalaにしてます)とプロジェクトを作成。
(このコマンドの内容とかにつてはいずれ調べたい…)

mkdir practice_scala
cd practice_scala

sbt new sbt/scala-seed.g8

何だか「[info] [SUCCESSFUL ]・・・」の文字が大量に出力されます。
しばらく待ちます。

name [My Something Project]:

プロジェクト名を求められたので「hello」と入力したら完了です。


確認すると「hello」ディレクトリができてたので移動してアプリ実行。

ls
> hello target

cd hello
sbt

また何か動き始めた…(;・∀・)
入力を求められたので「run」と入力。

> [info] Running example.Hello
> hello
> [success]…

と出たので完了のようです!


。。。あれ?まだコード書いてない。。。

とりあえずscala勉強するための環境構築

業務でscala使うことになりました。

scalaってどうやって勉強するかわからなかったので、

ScalaMatsuri 2017 の 「Scala introduction for Java developers - @seratch」 を参考に勉強するための環境を構築します。

セッション主の方のGitHubに設定方法が書いてありました。

ということで、勉強環境はsbtIntelliJを使って勉強していくことにしました。


sbt Reference Manual — 始める sbt

sbtのサイトにチュートリアルっぽいものがあったので、 まずはこちらから進めていくことにします。



ひとまず、インストールだけやっておく。

brew install sbt

ページの最上部(TOP)に戻るボタン

本日の業務中、

JSで手っ取り早くページ内の最上部(TOP)に戻る処理が必要になったので、メモしておく。

onclickイベントを利用してもいいし、関数として変数に代入しても問題ない。

document.body.scrollTop = document.documentElement.scrollTop = 0;

ただし、こちらの処理は実行されるとアニメーションなしで最上部に戻されます。

ユーザー目線だとページが高速で切り替わっているように見えます。


ついでに、アニメーションを利用するならどうしたらいいかも調べました。

業務では使わなかったけど。

$('html,body').animate({scrollTop: 0}, 300);

数値「0」が高さ0を表し、数値「300」移動スピードを表しています。