Showing posts with label angularjs. Show all posts
Showing posts with label angularjs. Show all posts

October 23, 2014

Backlogの課題を確認するChrome拡張機能を公開しました

Backlogの課題を確認するChrome拡張機能を公開しました。AngularJS(1.2)製です。

IssuesViewer For Backlog
https://chrome.google.com/webstore/detail/issuesviewer-for-backlog/ohgpfaebkmddhlpapnfjdoneoibhblkb


機能はざっと、以下な感じです。(0.0.7現在)

  • 自分の担当タスクを確認
  • 通知数を確認
  • マルチアカウント対応
  • 簡単な設定

"Setting"で、認証情報と検索条件を設定します。APIキーについては http://www.backlog.jp/help/usersguide/personal-settings/userguide2378.html を御覧ください。

ご意見ご要望は https://github.com/mamor/backlog-issues-viewer/issues まで。PR大歓迎です。

作った次の日にAngularJS 1.3がリリースされたので、テストケースを書きつつ1.3に上げる予定です。気が向き次第。

July 29, 2014

AngularJSで一文字ずつフェードインして表示するディレクティブのメモ

以下がサンプルです。 ポイントは、一文字ずつバラしてspanタグで囲み、1spanタグずつdelay()させつつfadeIn()させる感じです。(あんまりAngularJS関係ない。。。)

先日作ったインスタグラムカルタで使っていて、テスト(spec)は https://github.com/mamor/igkaruta/blob/master/spec/directives/myFadeInCharsSpec.js みたいな感じで書きました。

July 26, 2014

AngularJS と Laravel による Instagram の写真を使ったカルタを Heroku にデプロイしてみた

ふと、Instagramの写真でカルタできそうだなと思いついたので、作ってみました。

アプリケーションのURLは以下になります。
http://igkaruta.herokuapp.com/

ソースは以下で公開しています。
https://github.com/mamor/igkaruta


以下、遊び方。


1.
Login with Instagram > Play KARUTA と進みます。

2.
対象ユーザを選択して "GET PHOTOS" を押します。対象ユーザの写真有無チェックはまだしていないので、写真が取れなかったら別のユーザを選んで下さい。

3.
写真が表示されたら "START" を押します。カルタが始まります。


4.
"STOP" で一時停止、"START" で再開ができます。

5.
"GET PHOTOS" で、所謂ニューゲームになります。


以下、開発周り。


サーバサイドにはLaravelを使いました。が、InstagramのAPI(認証含む)の実行程度なので、大したことはしていません。尚、雛形には、ちまちまとオレオレ化させている https://github.com/mamor/laravel を使っています。

Herokuへのデプロイは
http://madroom-project.blogspot.jp/2014/07/herokuphppackagejsonnodejs.html
http://madroom-project.blogspot.jp/2014/07/herokuapplication-error.html
https://github.com/mamor/igkaruta/commit/462461e50c7a81dec00a2fddcf10f8760537491f
みたいな感じです。

クライアントサイドにはAngularJSを使いました。一番最初に勉強がてら作った TroubleClinic https://github.com/mamor/TroubleClinic の頃と比べて、少しはAngularJS力がついたかなぁと思います。ディレクトリ構成やソースの書き方は、Yeomanを参考にしています。

ちなみにYouFMもAngularJSで作っています。コイツもよろしくお願いしますw
https://chrome.google.com/webstore/detail/youfm/gbpebippikipomjijplmbepmginobjbj

テストはそれぞれ、PHPUnitとJasmine(+ gulp.js + Karma)で行っています。何かの参考になれば幸いです。


P.S.
アイデア等、PR歓迎です。誰か神経衰弱作って下さいw

April 12, 2014

Chrome.fmというChrome Extensionをリリースしました。

2014/04/19 追記:
名前がダメだったらしく、現在ストアから削除されています。後日、"YouFM"という名前にして、再度公開します。

2014/04/23 追記:
YouFMに名称変更して、再公開しました。
https://chrome.google.com/webstore/detail/youfm/gbpebippikipomjijplmbepmginobjbj

--

Chrome.fmという、YouTube動画を再生できるChrome Extensionをリリースしました。音楽プレイヤーのように使えます。

Chrome.fm:
https://chrome.google.com/webstore/detail/chromefm/gbpebippikipomjijplmbepmginobjbj

以下、特徴です。
  • 無料です(きっとずっと)
  • 動画の再生に、ウインドウ(タブ)を必要としません
  • シンプルなUIです
  • (手動で)再生中の動画名をTwitterにシェアできます

以下、近々実装予定の機能です。
  • 似た曲を垂れ流すラジオモード機能 (実装済み)
  • YouTubeプレイリストのインポート機能

尚、Chrome.fm内で発生したエラー情報は、品質向上を目的として、Sentryに送信されることがあります。このエラー情報に個人情報は含まれません。

開発的な部分を少し書いておくと
  • AngularJS
  • Bower
  • gulp.js
  • Jasmine
あたりを使っています。(JSライブラリはその他色々使っていますが。)

良かったら使ってみてください。アイデア等もお気軽に :)

April 5, 2014

AngularUIでsortable

AngularUIのsortableのメモです。
https://github.com/angular-ui/ui-sortable

AngularUIのsortableはjQuery UIのsortableをラッピングしています。
http://api.jqueryui.com/sortable/

以下、簡単なサンプルです。(console.log()結果がたまに間違っている気がするけど。。。)
http://jsfiddle.net/mamor/AWbRj/ このサンプルでは
  • jquery.min.js
  • jquery-ui.min.js
  • angular.min.js
  • angular-ui.min.js
を読み込んでいます。

AngularUIとjQuery UIのsortableドキュメントを見ながら、簡単に実装できそうですね。

April 3, 2014

AngularJSとAngularUIでBootstrapのModalを使う

AngularUIという、AngularJSを使ったUI開発用モジュール群があります。
http://angular-ui.github.io/
https://github.com/angular-ui

その中の"UI Bootstrap"を使うと、BootstrapのModalをAngularJSっぽく簡単に使うことができました。
http://angular-ui.github.io/bootstrap/

ソースは以下のような感じになります。
http://jsfiddle.net/mamor/4KBWj/

上記でAngularJSの他に読み込んでいるcssとjsは

Bootstrap公式のcss
https://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css

ui-bootstrap-tpls.min.js
https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/0.10.0/ui-bootstrap-tpls.min.js

です。また、Modalで使用するHTMLのテンプレートは、インラインではなく外部ファイルにすることもできました。

一つのモーダルを、ng-repeatで繰り返した全データで共用するのとか簡単に出来て楽だなーと思いました。

March 30, 2014

AngularJSで、使用するservice等を動的に変更する

$injectorを使うと、簡単に出来ました。

http://jsfiddle.net/mamor/kkqm6/ インターフェースっぽく使えないかなー。

March 29, 2014

AngularJSでGitHubのissuesとStack Overflowの質問を検索するツールを作ってみました

先日作ったツールを改良して、Stack Overflowの質問も検索できるようにしてみました。
http://madroom-project.blogspot.jp/2014/03/angularjsgithubissues.html

TroubleClinic
https://mamor.github.io/TroubleClinic/

今回、GitHubのAPI http://developer.github.com/v3/search/#search-issues を使ってみて、検索の精度が凄く高いなと思いました。

試しに、以前に自分がポストしたFuelPHPのissuesなんかも、それっぽいキーワードを指定したら、しっかりヒットしてくれました。

比べて、Stack OverflowのAPI https://api.stackexchange.com/docs/advanced-search は、まだ自分が慣れていないせいか、GitHubよりは意図した質問をヒットさせるのに苦労します。改良の余地があるかもしれませんね。

規模も小さいですし、(自分向け)AngularJSのサンプルとしても管理していこうかなと思います。

P.S.
PRくれた @hackoh さん、ありがとうございました :)

AngularJSでng-showを使ってローディング画像を表示したり非表示したりするメモ

ngShowが凄く便利だったのでメモしておきます。
http://docs.angularjs.org/api/ng/directive/ngShow

要は、対応する$scopeのプロパティで、表示非表示を切り替えられる感じでしょうか。

例えばHTML側で以下のようにして
<img src="xxx" ng-show="loading" />
JS側で
$scope.loading = true;
とすると表示されます。Ajax開始時にこれを行い、終わったらfalseにすれば非表示に戻りました。

March 26, 2014

AngularJSの独自ディレクティブをJasmineでspyしつつテストしてみた

以下の環境(今回のテストでは、jQueryを追加しています。)で
http://madroom-project.blogspot.jp/2014/03/gulp-karma-jasmine-phantomjs-angularjs.html

昨夜に作った独自ディレクティブをテストしてみました。
http://madroom-project.blogspot.jp/2014/03/angularjs.html
<div my-keypress-enter="enter(1)"></div>
のようなタグがある時にエンターキーが押されたら、対応する $scope.enter() が引数1で呼ばれる。みたいなテストです。

以下、CoffeeScriptですが、テスト(spec)のソースです。
describe 'myKeypressEnterDirective', () ->
  it 'should be bind keypress 13', inject ($rootScope, $compile) ->
    $scope = $rootScope.$new()

    $scope.spyCallback = () ->
    spyOn($scope, 'spyCallback')

    $element = $compile('<div my-keypress-enter="spyCallback(1)"></div>')($scope)

    $element.trigger($.Event('keypress', keyCode: 1))
    expect($scope.spyCallback).not.toHaveBeenCalled()

    $element.trigger($.Event('keypress', keyCode: 13))
    expect($scope.spyCallback).toHaveBeenCalledWith(1)
このやり方で良いのだろうか。(angular-scenario.js http://docs.angularjs.org/misc/downloading も気になる。。。)

AngularJSでGitHubのissuesを検索するサービスを作ってみた

とりあえずGitHubページに置いてあります。
http://mamor.github.io/gh-issues-search/
https://mamor.github.io/TroubleClinic/

レポジトリは以下です。
https://github.com/mamor/gh-issues-search
https://github.com/mamor/TroubleClinic

AngularJSを使ったら、思いついてから小一時間くらいでした。小規模だとBackbone.jsより楽かなーと思いました。

尚、APIのドキュメントは http://developer.github.com/v3/search/#search-issues になります。

細かな検索条件の指定とか、ローカルストレージを使ってレポのブックマークとかできるといーのかなーと思います。(気が向いたらやります。。。PR頂けると凄く嬉しいですw)

March 25, 2014

gulp.js + Karma + Jasmine + PhantomJS で AngularJS をテストしてみた

調べるのに少し時間がかかったので、メモがてら、書いておきます。(これが良いやり方なのかはわかりませんm(_ _)m)

gulpとkarmaをグローバルでインストールします。
$ sudo npm install -g gulp karma
どうもkarmaにパスが通っていないようなので、パスを通しておきます。
$ sudo ln -s /usr/lib/node_modules/karma/bin/karma /usr/local/bin/karma
(2014/05/23 追記: 上記、Ubuntu13.10上です。Macだと "/usr/local/lib/node_modules/karma/bin/karma" でした。)

必要なパッケージをローカルにインストールします。
$ mkdir xxx && cd xxx
$ npm install --save-dev gulp gulp-util gulp-karma karma-jasmine karma-phantomjs-launcher
package.json を自前で用意するなら、以下の様な感じになります。
{
    "name": "gulp-karma",
    "version": "0.1.0",
    "devDependencies": {
        "gulp": "~3.*",
        "gulp-util": "~2.*",
        "gulp-karma": "~0.*",
        "karma-jasmine": "~0.*",
        "karma-phantomjs-launcher": "~0.*"
    }
}
angular.js本体と、angular-mocks.js をダウンロードしておきます。
https://github.com/angular/angular.js/blob/master/src/ngMock/angular-mocks.js

今回は
  • ./vendor/angular.min.js
  • ./vendor/angular-mocks.js
として保存しました。

karmaの設定ファイルを作成します。以下、ブラウザを"Chrome"から"PhantomJS"に変えただけ(カーソルキーの上下で変えられました。)で、他はそのままです。
$ karma init

Which testing framework do you want to use ?
Press tab to list possible options. Enter to move to the next question.
> jasmine

Do you want to use Require.js ?
This will add Require.js plugin.
Press tab to list possible options. Enter to move to the next question.
> no

Do you want to capture any browsers automatically ?
Press tab to list possible options. Enter empty string to move to the next question.
> PhantomJS
>

What is the location of your source and test files ?
You can use glob patterns, eg. "js/*.js" or "test/**/*Spec.js".
Enter empty string to move to the next question.
>

Should any of the files included by the previous patterns be excluded ?
You can use glob patterns, eg. "**/*.swp".
Enter empty string to move to the next question.
>

Do you want Karma to watch all the files and run the tests on change ?
Press tab to list possible options.
> yes


Config file generated at "xxx/gulp-karma/karma.conf.js".
gulpfile.js を作成します。
var gulp = require('gulp');
var karma = require('gulp-karma');

gulp.task('karma', function () {
    var files = [
        'vendor/angular.min.js',
        'vendor/angular-mocks.js',
        'js/app.js',
        'spec/appSpec.js',
    ];

    gulp.src(files).pipe(karma({configFile: 'karma.conf.js'}));
});
テスト対象のjsファイルと、そのテスト(spec)のjsファイルを作成します。
$ mkdir js && mkdir spec
js/app.js
var myApp = angular.module('myApp', []);

myApp.filter('truncate', [function () {
    return function (text, length, end) {
        if (isNaN(length)) {
            length = 10;
        }

        if (end === void 0) {
            end = '...';
        }

        if (text.length <= length) {
            return text;
        }

        return text.substring(0, length - end.length) + end;
    };
}]);
spec/appSpec.js
describe('spec for popup.js', function() {
    beforeEach(function () {
        module('myApp');
    });

    it('should be truncated.', inject(function(truncateFilter) {
        expect(truncateFilter('1234567890')).toBe('1234567890');
        expect(truncateFilter('12345678901')).toBe('1234567...');
        expect(truncateFilter('1234567890', 4, '---')).toBe('1---');
        expect(truncateFilter('1234567890', 2, '---')).toBe('---');
    }));
});
テストを実行してみます。
$ gulp karma
[gulp] Using gulpfile /share/gulp-karma/gulpfile.js
[gulp] Starting 'karma'...
[gulp] Finished 'karma' after 7.23 ms
[gulp] Starting Karma server...
INFO [karma]: Karma v0.12.1 server started at http://localhost:9876/
INFO [launcher]: Starting browser PhantomJS
INFO [PhantomJS 1.9.7 (Linux)]: Connected on socket 6KRg3iwj9PAR6jMwlCqC with id 13100382
PhantomJS 1.9.7 (Linux): Executed 1 of 1 SUCCESS (0.041 secs / 0.009 secs)
試しに、テストを適当に書き換えて失敗させてみます。
$ gulp karma
[gulp] Using gulpfile /share/gulp-karma/gulpfile.js
[gulp] Starting 'karma'...
[gulp] Finished 'karma' after 8.24 ms
[gulp] Starting Karma server...
INFO [karma]: Karma v0.12.1 server started at http://localhost:9876/
INFO [launcher]: Starting browser PhantomJS
INFO [PhantomJS 1.9.7 (Linux)]: Connected on socket pjHN4RaPeEbzGFrtlZ35 with id 28598103
PhantomJS 1.9.7 (Linux) spec for popup.js should be truncated. FAILED
    Expected '---' to be '1--'.
PhantomJS 1.9.7 (Linux): Executed 1 of 1 (1 FAILED) ERROR (0.042 secs / 0.01 secs)
とりあえず、これでテストできるかなー。という感じにはなった気がします。

AngularJSでエンターキー押下を監視するディレクティブを作ってみた

またまたAngularJS勉強メモです。フィルタに続いてディレクティブです。エンターキーの押下程度なら、コントローラの中でbindしてやっても良いのでしょうが、AngularJSっぽくするにはこんな感じなのかなーと思います。(自信は無いですが。)

http://jsfiddle.net/mamor/Azt3p/

AngularJSで指定文字長オーバー時に後ろを"..."にするフィルタを作ってみた

AngularJSの勉強がてら、独自フィルタを作ってみたので書いておきます。

http://jsfiddle.net/mamor/sB7uJ/1/
ほとんど http://jsfiddle.net/tUyyx/ のまんまですが。。。

AngularJSで、ng-repeatしたデータにマウスオーバー(リーブ)時、ng-showやng-styleを変えるメモ

これがスマートなやり方なのかはわかりませんが、とりあえず以下の方法で出来ました。マウスオーバーすると"age"が表示され、文字色も変わります。 http://jsfiddle.net/mamor/2MNk8/

February 9, 2014

AngularJSで、Ajaxで取得したデータをng-repeatする

追記:
外部APIとの通信は $resource を使ったほうが良いかもしれません。
http://docs.angularjs.org/api/ngResource/service/$resource

--

気になっていたAngularJSを、少し触ってみました。試しに、このブログのフィード情報をAjaxで取得して、その結果をng-repeatして表示してみました。

以下、動作サンプルです。(AngularJSとしての書き方には、まだまだ自信が有りません。。。)
http://jsfiddle.net/mamor/wuwgr/1/

クロスドメイン問題を解決する為に、jQueryを併用しています。(AngularJSの$httpからだとどうにも解決できなかったので。)
あと、 $scope.$apply() 無しに angular.copy(entries, $scope.entries) すると上手くいきませんでした。
参考: http://stackoverflow.com/questions/17901391/when-i-update-my-model-in-ng-repeat-the-directive-ng-show-does-not-change

ところどころでハマりつつも、初日にしてはわりとスムーズに動かせたので、AngularJS好きかも。