Tumgik
swdyh · 7 years
Text
Ohacan ジョブカンのコマンドラインクライアントをつくりました
Tumblr media
出勤と退勤しかできませんが、ジョブカンのコマンドラインクライアントをつくりました。
Ohacan https://github.com/swdyh/ohacan
ここからバイナリがダウンロードできます https://github.com/swdyh/ohacan/releases
JOBCAN_GROUP_ID=111 JOBCAN_CODE=xxx
ふたつの環境変数を設定してください。GROUP_IDは出退勤のフォームのグループ選択のセレクトタグの値です。CODEのほうは、個人専用URLのうしろのについている値を使ってください。(CODEのほうは認証情報なので、envchainを使うのがおすすめです。)
出勤
$ ohacan in
退勤
$ ohacan out
3 notes · View notes
swdyh · 7 years
Text
複数の仮想環境を立ち上げてWeb開発するときに便利なmDNS
トレタアドベントカレンダー11日目です。
アドベントカレンダーを書くのは二年ぶりです。そのときは、家庭を支える技術アドベントカレンダーで、いまから帰るよという連絡をYOでするサービスをつくった話を書きました。いつのまにかあれから二年たちますが、今もほぼ毎日YOでkaeruyoしています。ここ最近AmazonのIoTボタンが盛り上がってますが、ボタンを押すだけの操作はYOに通じるものがありますね。YOのAPIで遊んでみるもおすすめです。
今回は最近知ったWeb開発のTipsを紹介しようと思います。VagrantやDockerを使ってウェブアプリを開発してるんですが、いつくかのアプリ同時にたときに、複数のVMを立ち上げたりすると、そのときポートフォワードしてるポートが被ってこけたり、別のポートに設定しなおしたりしていると、どのVMがどのポートにポートフォワードされてるのか分からなくなってしまい困ってました。最近いい解決策があるのを知ったので紹介します。
そもそもポートフォワードしてるのが面倒もの元凶で、たんにそれぞれのサーバにアクセスすればよいだけでした。IPだと結局どれがどれだかわからなくなるので、DNSを使って名前でアクセスできるようにします。ふつうにDNSで名前をふっていのはけっこう面倒ですが、mDNS(Multicast DNS )という仕組みを使えば、かんたんに済みます。
Vagrantfile
Vagrant.configure("2") do |config| config.vm.box = "ubuntu/trusty64" config.vm.hostname = 'vm1' config.vm.network "private_network", type: "dhcp" config.vm.provision "shell", inline: 'apt-get update && apt-get install -y avahi-daemon' end
vm1でWebサーバを立ち上げてアクセスできるか確認します。
echo '<html><body style="font-size:15em">VM1 da Yo</body></html>' > index.html ruby -run -e httpd . -p 3000
ブラウザでhttp://vm1.local:3000/にアクセスしてみます。
Tumblr media
みれました。
あとは別のVMを使うときには、別のhostnameをふってあげればポートフォワード地獄からおさらばできます。avahi-daemonの設定で別の名前にしたり、ポートを変えたりとかもできます。
手元の環境のホストマシンはMacですが、Windowsの場合iTunes(Bonjour)をインストールすればよいらしいのと、LLMNRというmDNSに似た別の仕組みもあるそうです。
あとDockerの場合も書きたかったですが、ちょっとまだ調査中なので、また別の機会に。
参考URL
Multicast DNS http://www.multicastdns.org
mDNS を使いローカルマシン内の仮想環境に接続する http://hateda.hatenadiary.jp/entry/mdns-and-vagrant
7 notes · View notes
swdyh · 8 years
Text
天下Wiki武道会に参加してきました
Tumblr media
京都で開催された天下wiki武道会(http://connpass.com/event/27643/)に行ってきました。東京からわざわざ参加するおもしろいひとや、Nota社やはてな社のおもしろいひとが集まっていて面白かったです。発表もみんな面白いし、参加者数も多くないから議論もはかどったり、おわった後もいろいろ話が出来たりしてとてもいい会だったなあと思いました。
自分も発表枠で参加してJottitの話をしてきました。Jottit、最近は動いてないことも多いし、Wikiを作ってるひとの話をいろいろ聞いて、Wiki作りたい気持ちが高まりつつあって、次回は作ったよっていう話ができたらいいなと思ったりしてます。
Remember Jottit (天下Wiki武道会 2016/03/25) http://swdyh.github.io/tenkawiki2016/
8 notes · View notes
swdyh · 8 years
Text
ButtonLessCam 長押しで撮影するiOSのカメラアプリをつくった
Tumblr media
ButtonlessCam - 長押しでかんたん撮影 https://itunes.apple.com/us/app/buttonlesscam-zhang-yashidekantan/id1042217704?l=ja&mt=8
スマホやタブレットで写真を撮るときには、そのときの持ち方や向きによって、シャッターボタンが押しにくいことがよくあったり、そのときに押しにくいボタンを無理やり押そうとして、手がつりそうになったり、本体が揺れてブレてしまうことがあったりするので、そのへんをなんとかできなかなと思ってカメラアプリをつくりました。
ButtonlessCamでは、シャッターボタンを押すかわりに、画面のどこでもいいので長押しをすることで撮影します。ほぼそれだけのカメラアプリです。
個人的に画像フィルターに興味があったので、ちょっと渋めになるやつを1種類だけいれてます。デフォルトでは、オリジナルの画像とそのフィルターがかかった写真の2枚が保存されます。どっちかにする設定が、iOSの設定のほうからいける設定画面にあるので、2枚を見比べてもらってお好みに設定してください。
フォーカスとか露出とかズームとか、いろいろ操作機能を途中までつくってみたものの、そういう機能を入れていくと面白みのないアプリになりそうだったのと、はじめてのiOSアプリでわからないことだらけなので、凝りだしたら時間がかかりすぎてリリース出来ない気がしたのでやめました。細かい調整をしながら撮影したい用途は他のカメラにまかせて、さっと気軽に撮りたいとき用にといいかなと思って使ってます。
49 notes · View notes
swdyh · 9 years
Text
帰宅連絡 KAERUYO #家庭を支える技術
Tumblr media
家庭を支える技術 Advent Calendar 2014 10日目の記事です。
帰宅するときの「いまから帰るよ」という連絡している家庭は多いと思いますが、うちではYoを利用していて、その紹介をしたいと思います。
Yoというのは、指定した相手にYoという通知を送ることができるだけのシンプルなサービスです。またAPIがあり、APIを使うともう少しだけ凝ったことができます。
このAPIを利用し、「KAERUYO」というYoユーザにYoすると、相手に「KAERUYO」からYoが届くという仕組みを作って、帰宅連絡に使っています。
わざわざAPIを使ったのは、相手に直接Yoしてしまうと、帰宅の連絡なのか分かりにくかったり、帰宅じゃないときになんとなくYoすると、帰宅ととられてしまったりして困るからです。
Yoを使う前はLINEで連絡していたんですが、最低でも5タップくらいは押さないといけなくて地味に面倒でした。この仕組だと、Yoアプリを立ち上げてKAERUYOをタップするだけ、という簡単さでとても快適です。
手間を省くという意味では、位置情報やビーコンとか、もっとハイテクな技術でもっと楽にできそうですが、「帰るよ」という連絡するというコミュニケーションとしての意味合いがなくなってしまいそうなので、それはそれで寂しいかもなあと思っています。
逆に、Yoだけしか送れないと不便じゃないの、LINEやメールでいいじゃん、と思うひともいると思いますが、Yoが送られてくると単純にそれだけでちょっと面白い感じがあります。あと位置情報やリンクも送れます。
この仕組を7月から運用していて、だいたい5ヶ月になりますが順調です。5ヶ月まえの時点では、APIだと60秒に一回しかYoを送ることができなかったため、わが家だけで地味に運用してきました。
ところが最近APIのドキュメントを見ていたら、制限についての記述がなくなっていて、試してみたら60秒待たなくても次のYoが送れるようになっていたので、他の家庭でも使ってもらえる仕組みとして作りなおすことにしました。
Tumblr media
KAERUYO http://kaeruyo.io
さっそく今日から公開します。帰宅の連絡が面倒だなと思っているかたはぜひ試してみてください。サイト登録してYoユーザのペアの登録してKAERUYOにYoすると使えるようになります。
KAERUYOのサイトのデザインは、いまトレタという会社で一緒に働いている@more_more_forさんにやってもらいました。Yo APIを使ったサーバの実装はGolangを使っていて、そのうちコードも公開しようと思っています。
明日の家庭を支える技術は、こちらもトレタで一緒に働いているiOSエンジニアの@y_kohさんです。
トレタは飲食店む���のiPadアプリを作っている会社で、そのサーバAPIの開発を@masuidriveさんとやっています。興味のあるかたはこちらもどうぞ
トレタ http://toreta.in トレタ 採用情報 https://www.wantedly.com/companies/toreta
89 notes · View notes
swdyh · 10 years
Text
チャットワークのチャットログと添付ファイルをまるっとダウンロード
チャットワークのチャットログと添付ファイルをまるっとダウンロードするツールをつくりました。最近チャットワークからSlackに移行して、過去ログを一応とっておこうと思ったらエクスポート機能がなかったのでつくることにしました。公式なAPIが一部ユーザに提供されているみたいですが、自分のアカウントでは使えなかったので、しかたなくふつうにパスワードを使ってブラウザがアクセスしているAPIを使っています。バックアップやオフライン時に参照したい、という用途等に使えると思います。
インストール
$ gem install goodbye_chatwork
チャットの一覧を表示
$ goodbye_chatwork -i [email protected] -p password 11111 チャットルーム1 35 22222 チャットルーム2 80
チャット名の前の数字がチャットルームのIDで、後ろの数字は件数です。ダウンロードはチャットルームのidを指定します。ログだけでいい場合は-eで、添付ファイルも一緒にダウンロードする場合は-xです。
$ goodbye_chatwork -i [email protected] -p password -e 11111 .... $ goodbye_chatwork -i [email protected] -p password -x 11111 ....
Github swdyh/goodbye_chatwork https://github.com/swdyh/goodbye_chatwork
3 notes · View notes
swdyh · 11 years
Text
go-enumerable 並行版関数を追加
Golangでスライスに対してmapやfilter処理をするgo-enumerableに、複数のGoroutineを使って実行するバージョンの関数を追加しました。
func ExampleMakeMapC() { var twiceInt func([]int) []int f := func(i int) int { time.Sleep(10 * time.Millisecond) return i * 2 } enumerable.MakeMapC(&twiceInt, f, 2) fmt.Println(twiceInt([]int{1, 2, 3})) // Output: // [2 4 6] }
MakeMapCではGoroutineの数を指定すると、その数のGoroutineを動かして計算を実行します。この例のようにスリープがあっても、別々のGoroutineで実行されるので逐次実行に比べて速く終わります。
MakeMapCの他にも、FilterとSomeとEvery用のMakeFilterC、MakeSomeC、MakeEveryCがあります。Reduceは前の計算結果に依存するのでありません。
それとMakeFirstというのも追加しました。これはGo Concurrency Patterns http://talks.golang.org/2012/concurrency.slide#48 にでてくるFirstを真似たもので、全部をGroutineで実行して、最初に結果を返した値を返します。複数のサーバにアクセスして最初に帰ってきた値を使うという用途に使えます。
package main import ( "fmt" "github.com/swdyh/go-enumerable/src/enumerable" "io/ioutil" "net/http" ) func main() { urls := []string{ "http://www.google.co.jp", "http://www.yahoo.co.jp"} var getAll func([]string) []string enumerable.MakeMapC(&getAll, func(url string) string { res, _ := http.Get(url) b, _ := ioutil.ReadAll(res.Body) return res.Status + " " + string(b)[0:50] }, 2) for _, v := range getAll(urls) { fmt.Println(v) } var getFirst func([]string) string enumerable.MakeFirst(&getFirst, func(url string) string { res, _ := http.Get(url) b, _ := ioutil.ReadAll(res.Body) return url + " " + res.Status + " " + string(b)[0:50] }) fmt.Println(getFirst(urls)) }
MakeMapCで作ったgetAllは同時にアクセスしてそれぞれの結果を表示します。MakeFirstで作ったgetFirstは最初に返ってきた結果を表示します。
Github https://github.com/swdyh/go-enumerable
0 notes
swdyh · 11 years
Text
GoのExampleテストが便利
Goでは、Example用のコードをgodocに表示させたり、テストとして実行して結果をチェックをすることができます。Example用のコードを書いて、それをドキュメントにコピペする作業や、その内容が古くなって動かないということから開放してくれます。
この仕組についてはtestingパッケージに説明があります。
testing - The Go Programming Language http://golang.org/pkg/testing/
実際に適当なパッケージを作って試してみます。パッケージ名をexexとします。
$ mkdir -p go-example-example/src/exex $ cd go-example-example $ export GOPATH=`pwd`
適当に関数や構造体を用意します。 go-example-example/src/exex/hello.go
package exex func Hello() string { return "hello" } type Foo struct { Name string } func (f *Foo) Hello() string { return "hello " + f.Name }
まずHello関数についてのExampleを書いてみます。 go-example-example/src/exex/example_test.go
package exex_test import ( "fmt" "exex" ) func ExampleHello() { fmt.Println(exex.Hello()) // Output: // foo }
パッケージをexexとは違うものにします。これは対象のパッケージをインポートして使うようなコード例にするためだと思います。Hello関数にはExampleHelloという名前の関数名を作り、// Output:というコメントとともに出力結果を書きます。この場合出力結果が異なるのでテストでエラーになります。
$ go test exex --- FAIL: ExampleHello (17.087us) got: hello want: foo FAIL FAIL exex 0.041s
// Output:の部分を修正します。
func ExampleHello() { fmt.Println(exex.Hello()) // Output: // hello }
これで実行すると、テストが成功します。またちゃんと実行されているかを確認したい場合は-vをつけて実行します。
$ go test exex ok exex 0.036s $ go test -v exex === RUN: ExampleHello --- PASS: ExampleHello (7.933us) PASS ok exex 0.035s
パッケージ全体用の例はExampleという名前の関数として書きます。FooのHelloメソッド用はExampleFoo_Helloという名前の関数として書きます。ある関数について複数の例を書く場合はアンダースコアをつけて、そのあとにその例の名前を書きます。
package exex_test import ( "exex" "fmt" ) func ExampleHello() { fmt.Println(exex.Hello()) // Output: // hello } func Example() { fmt.Println(exex.Hello()) f := exex.Foo{"world"} fmt.Println(f.Hello()) // Output: // hello // hello world } func ExampleFoo_Hello() { f := exex.Foo{Name: "world"} fmt.Println(f.Hello()) // Output: // hello world } func ExampleFoo_Hello_example() { f := exex.Foo{Name: "example!"} fmt.Println(f.Hello()) // Output: // hello example! }
これもテストしてみます。
$ go test -v exex === RUN: ExampleHello --- PASS: ExampleHello (8.31us) === RUN: Example --- PASS: Example (9.447us) === RUN: ExampleFoo_Hello --- PASS: ExampleFoo_Hello (5.993us) === RUN: ExampleFoo_Hello_example --- PASS: ExampleFoo_Hello_example (6.257us)
godocでExampleが表示されているかを確認してみます。
$ godoc -http=:6060
http://localhost:6060/pkg/exex/ を開きます。
Tumblr media
それぞれの部分にExampleが表示されます。
4 notes · View notes
swdyh · 11 years
Text
Opera15以降用のAutoPagerizeをリリース
Tumblr media
Opera15以降用のAutoPagerizeをリリースしました。Operaの拡張機能サイトからインストールしてください。
拡張機能「 AutoPagerize」 - Opera アドオン https://addons.opera.com/ja/extensions/details/autopagerize/
4 notes · View notes
swdyh · 11 years
Text
go-enumerable golangでスライスにmapとかfilter
Golangでスライスに対して、 map, filter(select), some(any), every(all), reduce(inject, foldl), reduceRight(foldr)を作る関数を書いてみました。
静的型言語でジェネリックがないGoだと、それらの関数そのものは書けない、もしくは書けても特定の型に専用か、interface{}を使うことになって使いにくくなってしまうのでリフレクションを使って動的に関数を作ってみることにしました。そのせいで静的チェックがあまり効かないので、堅牢なものを書きたいときにはふつうにforとrangeを使うのがいいと思います。リフレクションを使った例としては面白い気がしました。
var twiceInt func([]int) []int enumerable.MakeMap(&twiceInt, func(i int) int { return i * 2 }) fmt.Println(twiceInt([]int{1, 2, 3})) // [2 4 6] var filterOdd func([]int) []int enumerable.MakeFilter(&filterOdd, func(i int) bool { return i%2 == 1 }) fmt.Println(filterOdd([]int{1, 2, 3})) // [1 3]
Github https://github.com/swdyh/go-enumerable
0 notes
swdyh · 11 years
Text
Add-To-Zaim Chrome Extension
AddToZaim http://swdyh.github.io/add-to-zaim/
WebページからZaimに登録しやすくするChrome拡張をつくりました。ECサイトの注文履歴ページ、オンラインバンキングの取引明細、クレジットカードのオンライン利用明細などから、ワンクリックで、金額、日付、お店、メモが入力された状態のWeb版Zaimの入力画面を開くことができます。
このChrome拡張をインストールした状態でAmazonの注文履歴のページをみると金額の横にアイコンが表示されます。
アイコンをクリックすると、Zaimの入力ペー���へ移動して、金額、日付、お店、メモが入力された状態になります。
カテゴリは入力されないので、自分で選択する必要があります。あと事前にZaimにログインしている必要もあります。
いまはAmazonの注文履歴、楽天の購入履歴、UFJ Direct入出金明細、MyJCB利用明細に対応しています。
UFJとJCBは自分がそこを使っていて、銀行の口座引き落としやクレジットカード払いの電気代やガス代をZaimに登録するのに便利なように対応させてみました。様子を見ながら対応先を増やそうと思っています。
対応先の追加はAutoPagerizeのようにXPathを書くと対応サイトが追加できる仕組みにしていてあります。今はソースコードにそのまま書いている状態なので、追加等はGithubからプルリクエストで取り込みます。もう少し落ち着いたらwedataを使うようにするつもりです。
Github add-to-zaim https://github.com/swdyh/add-to-zaim
あとは過去の入力データとってきて入力済かどうかを表示したり、カテゴリを推定できたらいいなと思っていて、そこまでできたら、ある程度自動化もできるかもしれないなあと考えています。
1 note · View note
swdyh · 11 years
Text
X-Content-Type-Options: nosniff の効果
Heads up: nosniff header support coming to Chrome and Firefox https://github.com/blog/1482-heads-up-nosniff-header-support-coming-to-chrome-and-firefox
ChromeとFirefoxでnosniffってどういうことなんだろうと思って少し調べた。
IE8から、X-Content-Type-Options: nosniff があった場合は、ファイルの中身を自動判別する機能が無効になる。htmlじゃないものが自動判別でhtmlだと誤判別されて表示されることで起こるXSSを防ぐことができる。
Internet Explorer 8 のセキュリティ Part VI: Beta 2 の更新項目 http://msdn.microsoft.com/ja-jp/ie/dd218497.aspx
IE9から、X-Content-Type-Options: nosniff があった場合は、scriptが参照する応答でContent-Typeが以下の場合でない場合に読み込まない。
application/ecmascript application/javascript application/x-javascript text/ecmascript text/javascript text/jscript text/x-javascript text/vbs text/vbscript
スタイルシートはtext/cssでない場合に読み込まない。
MIME 処理の変更: X-Content-Type-Options: nosniff http://msdn.microsoft.com/ja-jp/library/ie/gg622941%28v=vs.85%29.aspx
ChromeとFirefoxのnosniffサポートという話は、IE9から加わった効果のことだった。GithubやGistのrawはtext/plainでnoniffをつけるから、Githubのアドレスを直接参照するスクリプトやスタイルシートは、ブラウザによっては動かなくなるよという話。
手元のChrome(28.0.1500.6 dev)だとjsはブロックするけど、cssはブロックしなかった。Firefox(Firefox 21 beta)はまだどちらもブロックしなかった。
GithubやGistのjsやらcssを直接参照するのは、ブラウザ次第で動かなくなるし、そもそもGithubの負荷になって迷惑になるのでやめましょう。
14 notes · View notes
swdyh · 11 years
Text
gisty version 0.2.4
Github APIにアクセスするときにUser-Agentを指定する要があったので追加しました。アップデートして使ってください。
1 note · View note
swdyh · 11 years
Text
Fulltext search with Node.js and elasticsearch
![](http://media.tumblr.com/tumblr_mdjj1edHXa1r3sayi.png) 東京Node学園祭2012の発表資料です。半分くらいはelasticsearchの紹介なのと、Node.jsから使ってる部分はhttpクライアントしか使っていないので、他のプログラミング言語で使う場合でもなんとなく雰囲気は分かるんじゃないかと思います。全文検索やelasticsearchに興味があれば見てみてください。 Fulltext search with Node.js and elasticsearch 2012 11/18 tokyo nodefest 2012 @swdyh http://swdyh.github.com/nodefest2012_es_node_slide/slide.html
0 notes
swdyh · 11 years
Text
東京Node学園祭2012で発表します
![](http://media.tumblr.com/tumblr_mdjj1edHXa1r3sayi.png) 今度の日曜(11/18)の東京Node学園祭2012でNode.jsとelasticsearchについての発表をします。時間が長いのでかんたんなライブコーディングもしてみるつもりです。ひさびさの発表なのと初ライブコーディングなので緊張しそうだけど、Substackさんの裏なので気楽にやろうと思います。 http://nodefest.jp/2012/session.html 14:15〜15:00 トラックB チケットのキャンセルが出たり埋まったりを繰り返してるみたいなので、チケットなくてもまだ手に入る可能性はありそうです。 http://atnd.org/event/Nodefest2012 https://twitter.com/nodefest いまちょうどスライドを作っていて、スライドの内容をmarkdownで書いて、redcarpetでhtmlにして、それをも��にnokogiriでshowerのhtmlツリーを作ってを書き出すみたいなよくわからないことをしながらスライドを作っています。 https://github.com/pepelsbey/shower
0 notes
swdyh · 12 years
Photo
Tumblr media
6 notes · View notes
swdyh · 12 years
Text
Yet Another npm Search
![screen capture](https://raw.github.com/swdyh/ya-npm-search-server/master/public/sc001_60.png) Yet Another npm search http://ya-npm-search.herokuapp.com/ "Yet Another npm search" is a search engine for npm packages that indexed by elasticsearch. It runs on heroku and bonsai elasticsearch addon. command line interface: ![command line interface](http://media.tumblr.com/tumblr_m9g6kxqjLi1r3sayi.png) npm install -g ya-npm-search ya-npm-search keyword source code: github ya-npm-saerch-server https://github.com/swdyh/ya-npm-saerch-server github ya-npm-search-cli https://github.com/swdyh/ya-npm-search-cli
6 notes · View notes