しまてく

学んだ技術を書きためるブログ

ブラウザの音声認識と音声合成を使ってなんちゃってiliを作ってみた。

突然ですが、みなさん ili というプロダクトをご存知でしょうか?
iamili.com


このサイトで公開されている動画のイケメン男性が英語で日本人女性を口説く
流れを追ったものなのですが、その便利さとイケメンさが相まって最後には
突然のキスをするというアレな感じの動画ですね。

とはいえこの動画に出てくるiliというプロダクトは言語の壁を破るという点でとても可能性を感じました。

自作してみた。

今のhtml5周りでは音声認識音声合成がだいぶ使えるようになってきているので
今回はそれとmicrosoftの翻訳apiを利用してなんちゃってiliを作ってみました。

実際の成果物は以下になります。pcでも良いですが、レイアウトをスマホ用に
作り込んでいるのでchromeが使えるスマホでアクセスするのがいいと思います。
talktrans.herokuapp.com
f:id:cimadai:20160131154448g:plain

参考にしたサイトは以下です。
qiita.com


qiita.com

環境

  • サーバー

heroku

node.js (5.5.0) + express

システム構成

f:id:cimadai:20160131154410p:plain

ソースコード

npmで入れるもの。

  • npm install express-generator -g
  • npm install --save xml2js
  • npm install --save request
  • npm install --save express

基本的にexpressコマンド(express-generatorで入る)で作成したプロジェクトをそのまま使っています。

server side

talktrans - server side

サーバーサイドのtranslate.jsにmicrosoft apiのclient_idとclient_secretを入れる必要があるのですが、
これは自分で取得したものを入力してください。

client side

talktrans - client side

まとめ

これで英語圏の美女に対して無双ができるという算段です!
便利な世の中ですね!!

DockerとかWerckerとかPlay使ってネタ募集箱というアプリを作ってみた。

なんとなくサイボウズのブログを見ていたところ、
blog.cybozu.io
こんな記事を見つけました。

この中に出てくるネタ募集箱というのがとても便利そうでいいなーと思って
いろいろと試したかったこともあるので自作してみました。
github.com


このエントリではそこで学んだことをまとめます。

構成

長いので以下の三部に分けています。

  • 開発環境

f:id:cimadai:20160127231444p:plain

  • 動作環境

f:id:cimadai:20160127231451p:plain

  • 開発言語

f:id:cimadai:20160127231447p:plain

開発環境

この項では普段私が使っている開発環境について紹介をします。
と思ったんだけどスライドにまとめたのでそちらを見てください。

秘話

実は公開するつもりなくprivateでスラスラ書いていました。

ところがある程度まで形になったところで「あ、これ公開しよ」とふと思い立ち
公開したんですがその時にある問題が。。。

勘のいい方はお気づきかもしれませんね。

よくやる過ちに名を連ねる、「リポジトリに秘密情報をいれてしまう」ということを
かなりの初期からやらかしてしまっていました。

かなりの初期からなので一つずつ直すのも辛すぎるのでなんかないかと思って
調べていたら「最強のオプション: filter-branch」というのを見つけ、これで
過去の歴史を書き換えて万事解決しました、という話。
Git - 歴史の書き換え


いやー、リポジトリに秘密情報はいれたらダメですね。

github.com

こういうのとか
Vault by HashiCorp

こういうのを使ったらいいのかな?

OpenCV 3.1 をsbt / Scala で使ってみた。

今日はいままでやろうやろうと思っていた系の技術、OpenCVを触ってみようと思います。

www.buildinsider.net

ここを見るといろいろなことができるんですね、驚きました。

不要なオブジェクト消去とかPhotoshop CCで話題になったアノ機能も作れちゃうんですね!
それでは早速やってみましょう。

基本的に公式のドキュメントに書いてある通りに進めていきます。
OpenCV: Introduction to Java Development

今回の環境

Get proper OpenCV (最新のOpenCVを取得)

まずOpenCVをインストールします。
私はbrew派なので以下のコマンドでまずOpenCVを探します。

brew search opencv

その結果二つのopencvが見つかりました。今回は3.1を使いたいので下の方でいきます。

homebrew/science/opencv
homebrew/science/opencv3

Scalaから使いたいので、with-javaオプションをつけてインストールします。
初めはwith-contribオプションは無しでやったんですが、実際に使う時にエラーになってしまったのでつけました。

brew tap homebrew/science
brew install opencv3 --with-contrib --with-java

※with-contrib無しで出たエラー。

[error] (run-main-0) java.lang.UnsatisfiedLinkError: no opencv_java310 in java.library.path
java.lang.UnsatisfiedLinkError: no opencv_java310 in java.library.path
	at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1864)
	at java.lang.Runtime.loadLibrary0(Runtime.java:870)
	at java.lang.System.loadLibrary(System.java:1122)
	at DetectFaceDemo$.delayedEndpoint$DetectFaceDemo$1(DetectFaceDemo.scala:7)
	at DetectFaceDemo$delayedInit$body.apply(DetectFaceDemo.scala:6)
	at scala.Function0$class.apply$mcV$sp(Function0.scala:34)
	at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
	at scala.App$$anonfun$main$1.apply(App.scala:76)
	at scala.App$$anonfun$main$1.apply(App.scala:76)
	at scala.collection.immutable.List.foreach(List.scala:381)
	at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
	at scala.App$class.main(App.scala:76)
	at DetectFaceDemo$.main(DetectFaceDemo.scala:6)
	at DetectFaceDemo.main(DetectFaceDemo.scala)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)

ビルドなどしてくれているのでしばらく待つと無事インストールできました。

==> Reinstalling homebrew/science/opencv3 with --with-java, --with-contrib
==> Using Homebrew-provided fortran compiler.
This may be changed by setting the FC environment variable.
==> Downloading https://github.com/Itseez/opencv/archive/3.1.0.tar.gz
Already downloaded: /Library/Caches/Homebrew/opencv3-3.1.0.tar.gz
==> Downloading https://github.com/Itseez/opencv_contrib/archive/3.1.0.tar.gz
Already downloaded: /Library/Caches/Homebrew/opencv3--contrib-3.1.0.tar.gz
==> Downloading https://downloads.sourceforge.net/project/opencvlibrary/3rdparty/ippicv/ippicv_macosx_20141027.tgz
Already downloaded: /Library/Caches/Homebrew/opencv3--icv-macosx-20141027.tgz
==> cmake .. -DCMAKE_C_FLAGS_RELEASE= -DCMAKE_CXX_FLAGS_RELEASE= -DCMAKE_INSTALL_PREFIX=/usr/local/Cellar/opencv3/3.1.0_1 -DCMAKE_BU
==> make
==> make install
==> Caveats
This formula is keg-only, which means it was not symlinked into /usr/local.

opencv3 and opencv install many of the same files.

Generally there are no consequences of this for you. If you build your
own software and it requires this formula, you'll need to add to your
build variables:

    LDFLAGS:  -L/usr/local/opt/opencv3/lib
    CPPFLAGS: -I/usr/local/opt/opencv3/include

If you need Python to find bindings for this keg-only formula, run:
  echo /usr/local/opt/opencv3/lib/python2.7/site-packages >> /usr/local/lib/python2.7/site-packages/opencv3.pth
==> Summary
🍺  /usr/local/Cellar/opencv3/3.1.0_1: 397 files, 134M, built in 14.2 minutes

インストールは「/usr/local/Cellar/opencv3/3.1.0_1/」にされたようです。

Java sample with Ant (AntでのJavaサンプル)

私はantは使いませんので今回はここはスキップします。

SBT project for Java and Scala (Java/Scala向けsbtプロジェクト)

この公式ドキュメントのタイトルが「Introduction to Java Development」なんですが
ここからScalaも登場します。

sbtプロジェクトの作成

もろもろ下の感じで作っていきます。

cd <<src-dir>> # ~/src とか

# プロジェクトのディレクトリ作成
mkdir -p opencv31_test && cd opencv31_test

# sbtのbuild.propertiesを作成
mkdir project
echo "sbt.version=0.13.8" > project/build.properties

# OpenCVのライブラリをコピー
mkdir lib
cp /usr/local/Cellar/opencv3/3.1.0_1/share/OpenCV/java/opencv-310.jar ./lib/opencv-310.jar
cp /usr/local/Cellar/opencv3/3.1.0_1/share/OpenCV/java/libopencv_java310.so ./lib/libopencv_java310.dylib

# リソース用のディレクトリ作成
mkdir -p ./src/main/resources

# OpenCVで顔認識するための検出器データコピー
cp /usr/local/Cellar/opencv3/3.1.0_1/share/OpenCV/lbpcascades/lbpcascade_frontalface.xml ./src/main/resources/

# OpenCVで顔認識するための元データ
wget http://docs.opencv.org/master/lena.png -P ./src/main/resources

# ソース用のディレクトリ作成
mkdir -p ./src/main/scala

※なぜsbtを使っているのにlibディレクトリにライブラリをコピーするということをかというと、
まだmavenリポジトリに3.1が登録されてないんですよね。残念。

  • 顔認識するためのデータは顔認識界のマドンナ、レナさんですね。

f:id:cimadai:20160127200443p:plain

build.sbtとソースコード

./src/main/scala/DetectFaceDemo.scala に配置してください。

この時点でtreeをすると以下のようになっているはずです。

$ tree
.
├── build.sbt
├── lib
│   ├── libopencv_java310.dylib
│   └── opencv-310.jar
├── project
│   └── build.properties
└── src
    └── main
        ├── resources
        │   ├── lbpcascade_frontalface.xml
        │   └── lena.png
        └── scala
            └── DetectFaceDemo.scala
いよいよ実行
sbt run

こんな感じのログがでて実行が終了します。

[info] Loading global plugins from /Users/daisuke-shimada/.sbt/0.13/plugins
[info] Loading project definition from /Users/daisuke-shimada/src/opencv31_usage_scala/project
[info] Set current project to opencv31_usage_scala (in build file:/Users/daisuke-shimada/src/opencv31_usage_scala/)
[info] Compiling 1 Scala source to /Users/daisuke-shimada/src/opencv31_usage_scala/target/scala-2.11/classes...
[info] Running DetectFaceDemo
[info] Detected 1 faces
[info] Writing faceDetection.png
[success]

画像認識の結果

f:id:cimadai:20160127200449p:plain

できました!

まとめ

思ったより簡単にできましたね!
これからいろんなサンプルあそんでみよー

情報科学若手の会 冬の陣 2016に参加してきました。

こんにちはこんにちは。

1/23 (土) に行われた「情報科学若手の会 冬の陣 2016」に参加してきましたのでそのまとめです。
https://atnd.org/events/72653

幅広い議論を生むためにアカデミックに振り切り過ぎていない勉強会です。

Let's Encrypt の紹介

小谷 大祐 (@daisuke_k) さん

要点
  • あなたの通信はおそらく見られている。
    • NSAは見ている。
      • Snowden氏が2013年に告発した。
    • 中国も見ている。
      • Great FirewallやJavaScriptの改ざんなど。
  • Anti censorship
    • Pervasive Monitoring(大規模モニタリング)対策の機運の高まり
    • もはやサーバーとクライアントの間の通信は暗号化必須。

企業スポンサーの金額

Platinum 年間契約 $350,000/年 (USD)
Platinum 三年契約 $300,000/年 (USD)
Gold $150,000/年 (USD)
Silver (社員1000人以上) $50,000/年 (USD)
Silver (社員100〜999人) $25,000/年 (USD)
Silver (社員1〜99人) $10,000/年 (USD)
  • 技術的にはなぜ無料にできたか?
    • Domain Validationの証明書を発行するプロセスを全て自動化したため。
    • ACMEプロトコルで標準化している。
  • 証明書の種類
    • DV (Domain Validation): ドメインの所有を確認して発行
    • OV (Organization Validation): 組織の実在の確認をして発行
      • 企業情報データベースを確認するなど
    • EV (Extended Validation): より厳密な実在確認をして発行
      • OVに加え、電話確認をするなど
      • EVはアドレスバーも変わるので見た目が良い。
まとめ

AWS Certificate Managerも出てきていたりと、TLSでセキュアにする流れはきている。
簡単にセキュアにできるのでどんどんしていきましょう。

次世代コンピューターシステムの妄想と不揮発性メモリを活用したファイルシステム

島津 真人 (@MakotoShimazu) さん

要点
  • 次世代不揮発性メモリ (Persistant Memory: PM) すごい。
  • これを使って超高速にデータの読み書きできる。
  • named_mallocでPersistantな名前付きメモリ空間を確保したりとか。
  • ただしPersistantがゆえに、不具合があった場合に再起動でリセットされないとか悲しみもある。
  • 詳しくは↑のslideshareから。

最近のインフラ・運用事情

whywaita さん

要点
  • タイトルとは違って「@tarama13 事件」についての懺悔ww
    • Twitterの釣りアカウントを大量に運用しており、その中の一つに先輩が引っかかってしまった。
    • 文字起こしがはばかられるような事態になるww
まとめ
  • 大学は特殊な環境なのでTwitterの釣りアカウントにも引っかかりやすい。
  • 純粋な心を弄んではいけない。

中高生を騙して儲ける今どきのLINEスパムとその背景

did2memo さん

要点
  • いまLineでよくあるスパムは大別すると3種類になる。
    • サクラサイト系スパム
    • パクツイ@Line系スパム
    • 無料プレゼント系スパム
  • 今回の話は無料プレゼント系スパム
  • 無料プレゼント系スパムの手口
    • 友達から突然「本当にコインもらえた! http://xxxxxxxxx 」のようにURL付きメッセージが飛んでくる。
    • 友達から来たので本当なのかな?と思ってアクセスする。
    • 無料でコインをゲットするには以下の手順を実施する必要がある。
      • Step1. まず友達10人に「本当にコインもらえた! http://xxxxxxxxx 」というメッセージを送る。
      • Step2. 自分のタイムラインにも同じメッセージを投稿する。
      • Step3. とあるアプリをインストールする。
      • Step4. お疲れ様でした。コイン配布までしばらくお待ちください。

こんなんで騙されるの?というガバガバ手口だけど中高生は引っかかるらしい。

  • 流れで言えばこんな感じ。

アプリ業者
↓ 200円
ASP(仲介)
↓ 100円
スパマー
↓ 紹介 (アプリインストールしてね)
中高生

まとめ
  • ここでのポイント
    • 中高生はインストールだけなので損はしない。
    • アプリ業者はランキングが上がることによって副次的に儲かる。
    • ASPは仲介だけで儲かる。
    • スパマーも数を騙すことで儲かる。

あれ?みんなWin-Win?

損をしていないので詐欺としては立件できないのでは?という話でした。

「ロボットの耳」作りに必要な音声信号処理技術

qwerty__ さん

要点
  • ロボットの耳に必要な三要素は「音源定位」「音源分離」「音声認識
    • 音源定位
      • どの方向にあるのか?
      • MUSIC法がよく使われる。(Multiple Signal classification)
    • 音源分離
      • 混合音から各音源ごとの信号は系を推定
      • Beam Forming (BG)
      • マイク感の音到達時間差を利用
    • 音声認識
  • HARK (OSS)
    • 「音源定位」「音源分離」「音声認識」の機能を備えたフレームワーク
    • 他チャンネル信号処理システム構築が可能。
    • ロボット用OS (ROS)とも連携できる。
  • 応用
    • 「早言い」合図を識別できるロボットクイズ司会者


まとめ
  • 音声信号処理の応用研究
    • ドローンからの音源定位
    • 音を利用したロボットの自己姿勢推定
    • 生物の鳴き声解析

これからどんどん発展していきそう。

プラレール向け自動列車停止装置の開発

内田公太 (@uchan_nos)

要点

発表内容は非公開なので伏せます。 *

まとめ

CSアンプラグドの教えかたはとても面白い!

LT

面白すぎてメモしてませんでした(´・ω・`)

さくらの死活監視の話で出てきたパトライトはとてもよかった!

まとめ

みんなレベル高い発表でとても面白かったです。
僕も懇親会で飲みながら飛び入りで話させてもらいました。
その話はまた別エントリでまとめます。

Chatwork APIを利用するためのScala Libraryをmavenに公開してみた。

こんにちはこんにちは。

みなさんChatwork使ってますか?

私の所属する会社では今Chatworkをコミュニケーションツールとして使っています。
ChatworkはAPIが公開されており、(気になるところはあるけど)使うことができます。

使うことができるなら使ってみよう!ということで、なんか軽いライブラリーないのかなー
と探していたんですがあまり気に入るものがなかったので自分で書いてみて、mavenリポジトリ
追加するまでをやってみたので記事にしてみます。

私のmavenデビューなのでちょっと嬉し恥ずかしな感じです。

chatwork-scala

chatwork-scalaというのが私が公開しているライブラリになります。

ソースコード(GitHub)

https://github.com/cimadai/chatwork-scala

ツッコミ・ダメだし歓迎ですのでみなさんよろしくお願いします!

使い方

build.sbtに以下を追記します。

libraryDependencies += "net.cimadai" %% "chatwork-scala" % "1.0.1"

コード例

とまあこんな感じで簡単に使うことができます。

コードの作りはいたってシンプルなので特筆すべきところはないのですが、テストダメ夫です。

さいごに

Chatwork APIを利用するライブラリを作っておいてなんなんですが、
ChatworkとSlackをどちらも使った感触で言えば、やはりAPIの出来が段違いですね。

Chatwork APIにstreamでメッセージを取得するのが無いのは人工無能的なbotを作ることを考えると痛いです。
自分でpollingして新着メッセージをGetしないといけない風なのでどうしてもレスが遅れるんですよね。

超頻繁にGetしたら解決するのかもしれませんが、APIのコール数による課金の壁があって心が折れました。

ということで私はSlackの世界に逃げ込みます。

【ヒカ☆ラボ】さくらインターネットとMilkcocoa!年末イベント:ここだけのウラ話 に行ってきた。

ヒカ☆ラボことヒカリエ・ラボラトリー(レバレジーズが運営するイベント)に行ってきました。
最近は随分勉強会から離れてしまっていたので久しぶりの参加でした。

mlkcca.connpass.com

レバレジーズとは?

  • 941さんが紹介してたので引用。

blog.kushii.net

  • プログラミングに特化したQAサイト「teratail」を運営している。

teratail.com

Milkcocoaの裏側 - Technical Rockstars CEO 部谷(ひや) 修平さん

モデル駆動開発をやっていた。
  • 設計図を書いて、シミュレーションし、ソースコードに落とす手法。
  • これを実践するためのプラットフォーム CloudMDD でIPA未踏に採択された。
Technical Rockstarsのサービス
  • milkcocoa
    • MQTTでデータのやりとりができるAPIを提供しているBaaS
  • FLOWer
    • データの流れが見えるビジュアルプログラミング
  • clooca
Milkcocoaとは
  • シンプルなコンセプト
  • イデアx技術でかんたんに作れる
  • 裏はErlang x cassandra

実際にサイトを見てみるとかっこよくて、ワクワクするサービスです。

開発の裏話
  • スタートアップの開発現場あるある
    • とにかく早く開発しないといけない。
    • 開発できなければ価値があるかどうかわからない。
      • 2014/8: 開発開始
      • 2015/4: IoTに方針転換 (この時点でサーバーサイドは部谷さん一人)
      • 2015/5: リリース
  • 開発速度をあげるには
    • プロトタイピング力
      • 道具の幅を持つこと
      • 普段から広げておくことが大事
    • 継続的インテグレーション
      • 石橋を高速に叩いて渡る
      • 心理的負担を減らす
    • アーキテクチャ
      • コード量を減らす
      • 機能追加をしやすくする
      • テストを書きやすくする
  • アーキテクチャ
    • 目的を持って設計する。
      • まず「良い設計」を定義すべき
    • コンピューターサイエンスとか情報工学とかの下地は必要
  • Milkcocoaの初期の開発方針 (優先順位は上から)
    • 簡単に機能を追加したい
    • ベンダロックインを防ぎたい
    • 運用を楽にしたい
    • 多人数で開発したい(学習コストを減らしたい)
    • 早く動くものを作りたい
  • 開発する中でなにが起こるかわからないので、
    • 型を決めてテストバリバリした
    • Dockerでポータブルに環境構築
    • サーバーイメージは全てコード化して構築は自動化(fabric)
    • クライアント/サーバーサイドは全てHexe
    • サーバーサイドはHexe x node.js
  • すると...
    • 途中からなにも進まなくなった
      • 新しくなにかを追加する時にハードルが劇高になった。
  • 最終的な構成
    • Node.js + MongoDB の構成を Erlang + Cassandra に変更 (1サーバーあたりの処理量アップ)
    • MQTTに対応
    • さくらサーバーに変更 (コスト削減)
  • 再度、開発方針を立て直し
    • とにかくシステムを小さく分ける。
    • とにかく初期コストを抑える。
    • 前の方針はそれぞれは良い方法なので、採用できる部分をところどころ採用。
    • テストは初めに少し書いて後から追加するように。
      • →マイクロサービスっぽい感じで。
    • サービス分けまくってインターフェースで結合するように
    • サーバーレスアーキテクチャ
    • 既存のSaaSも連携させて高速に。
  • Microservicesの利点
    • ちゃんとIFが切れていればそこだけ変更しやすい
    • 性能や通信が問題な箇所だけ重課金、それ以外はDockerとはHeroku
    • とにもかくにもインターフェース重要。
  • やったこといろいろ
    • MQTTベースにする。
      • 良かった点
        • 自前でやることが減った。
        • 再送制御とか乗っかった利点がある。
      • 悪かった点
        • アクセス制御のパーミッションの応答とか返しづらかった。
        • 工夫次第でなんとかなる。
    • AWSからさくらクラウド
      • 移行はかなり簡単にできた。
    • Node.jsからErlang
      • セキュリティルール言語
        • もともとHexeでパーサー作ってた。
        • Erlangでもパーサーは楽に作れた。
      • HexeはHexe Serializerが、ErlangはBERT(Binary ERlang Term)がある。
    • Erlanのデプロイ

まとめ

  • 目的をもって設計する
  • 小さいサービスにシステムを分ける
  • 細かいことはサービス毎に分ける
  • クリティカルな部分は重課金で

使ってみたいサービス

*1:milkcocoaと競合らしい。

GitLab 8.2.1でGitLFSを使ってみる

GitLFSの導入

前回の記事でGitLabをインストールしましたが、入れたバージョンは8.2.1だったのでGitLFSが利用できるバージョンです。
利用できるというのであれば是非使ってみましょう。
ということで今回はGitLFSを使えるようにしてみます。

前回の記事はこちら
cimadai.hateblo.jp

gitとgit-lfsのインストール

% brew install git
% brew install git-lfs

はじめはMac標準のgitとbrewで入れたgit-lfs使っていたんですがどうも上手く動かなかったのでどっちもbrewで入れることに。

GitLFSの設定をする

GitLFSで管理する対象を拡張子で指定
% git lfs track "*.zip"

このように拡張子で設定をすると「.gitattributes」にその情報が書き込まれます。

GitLFSの設定を確認
% git lfs track

Listing tracked paths
    *.zip (.gitattributes)

これで以降git addした時にzip拡張子のファイルはGitLFSで管理されます。

試しに確認してみる。

適当にファイルを作ってadd / commitしてから「git lfs ls-files」できちんと認識されているか確認する。

% echo test > test.zip
% git add test.zip
% git commit -m"Add test.zip"
% git lfs ls-files
f2ca1bb6c7 * test.zip

ちゃんと認識されているので良さそうです。

認証用のキャッシュ設定(これが無いとpushする時に何度もユーザーID/パスワード聞かれる)

http://doc.gitlab.com/ce/workflow/lfs/manage_large_binaries_with_git_lfs.html
ここを参考に。

% git config --global credential.helper 'cache --timeout=3600'
LFS用のURL設定

同じく上のURLに書いてあるように

# こんな感じでLFS用のURLを登録して、
% git config --add lfs.url "http://192.168.33.10:10080/cimadai/test.git/info/lfs/objects/batch"

# おもむろにpush
% git push

Git LFS: (0 of 1 files) 0 B / 2.57 MB
Repository or object not found: http://192.168.33.10:10080/cimadai/test.git/info/lfs/objects/batch/objects
Check that it exists and that you have proper access to it
error: failed to push some refs to 'ssh://git@192.168.33.10:10022/cimadai/test.git'

あれ?失敗。

Repository or object not foundのURLをよく見ると自分が設定したURLにさらに「objects」が含まれていることに気がつきます。

ぐぐるとこんな記事を発見。

https://secure.phabricator.com/T7789
> For HTTPS URLs, it appends "/info/lfs" to the remote URL

これはもしかすると「info/lfs」まででいいのか?

# 一旦URL削除
% git config --unset lfs.url

# もう一度登録しなおし
% git config --add lfs.url "http://192.168.33.10:10080/cimadai/test.git/info/lfs"

# 再チャレンジ
% git push

Username for 'http://192.168.33.10:10080': cimadai
Password for 'http://cimadai@192.168.33.10:10080':
Username for 'http://192.168.33.10:10080': cimadai
Password for 'http://cimadai@192.168.33.10:10080':
Git LFS: (0 of 1 files) 0 B / 2.57 MB
Server supports batch API only, please update your Git LFS client to version 1.0.1 and up.
Docs: http://192.168.33.10:10080/help
error: failed to push some refs to 'ssh://git@192.168.33.10:10022/cimadai/test.git'

エラーが変わった。URLはこれでいいっぽいけど今度は「Server supports batch API only, please update your Git LFS client to version 1.0.1 and up.」と言われた。

再びググる

batch APIを効にするにはlfs.batchという項目を消せばいいらしい。 *1
cf: https://githb.com/github/git-lfs/blob/master/docs/api/http-v1-batch.md

# 不要な設定を削除
% git config --unset lfs.batch

# 3度目の正直
% git push

Username for 'http://192.168.33.10:10080': cimadai
Password for 'http://cimadai@192.168.33.10:10080':
Git LFS: (1 of 1 files) 5 B / 5 B
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 334 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://git@192.168.33.10:10022/cimadai/test.git
    6e6d647..b56d977  master -> master

できたー!

*1:そんなの登録した記憶はないのだけど確かに設定されている...