UI BootstrapのPagerが機能しなくてハマった

AngularJSでBootstrapを扱うためのライブラリ、UI Bootstrapを使ってみたんですが、サンプルコードを参考にPagerを実装してもなぜか機能してくれなくてハマってしまいました。

サンプルコードを記載しているページではちゃんと機能しているので、AngularJSとui.bootstrapのバージョンの組み合わせでうまくいかなくなったりしてるのかなぁと勝手に想像しています。

めんどうなのでちゃんと確認はしていませんが、以下のようにすることで機能できるようにはできました。

サンプルコード

Markup

<pager total-items="totalItems" ng-model="currentPage"></pager>

JavaScript

$scope.pageChanged = function() {
    console.log('Page changed to: ' + $scope.currentPage);
};

Angular directives for Bootstrap


サンプルコードではこうなっているのですが、これだとpageChangedが呼ばれませんでした。

修正後のコード

Markup

<pager ng-change="pageChanged()" total-items="totalItems" ng-model="currentPage"></pager>

なので、ng-changeを明示的に記述し呼ばれるように修正。

Bootstrapファーストガイド―CSS設計の手間を大幅に削減!

Bootstrapファーストガイド―CSS設計の手間を大幅に削減!

Flaskでリダイレクトしたよとかいう警告が出る

こんな警告が出て解消するのに少しハマった。

'A request was sent to this URL (http://localhost/my/contributors) but a redirect was issued automatically by the routing system to "http://localhost:5000/my/contributors/". Make sure to directly send your POST-requ
est to this URL since we can't make browsers or HTTP clients redirect with form data reliably or without user interaction.
Note: this exception is only raised in debug mode'

たぶん、flask側でリダイレクトしなくて済むようにちゃんとURLを指定しろよって言ってるんだと思う。

ルーティングはこうなっているのに

@app.route('/my/contributors/', methods=['POST'])

URLはこうなっていた。

$http({
	method : 'post',
	url    : '/my/contributors', // 後ろにスラがない!
	data   : {id: $scope.contributor.id}
})

スラッシュを加えることで解消されました。

go getで導入したパッケージをIntelliJ IDEAに認識させるための設定

IntelliJでデフォルト設定のままgolangの開発を行っていると、"go get"で取得したパッケージを認識できなくて、名前解決できないよーと警告表示されるかと思います。

これを解消にするには、"go get"で取得したパッケージが置かれる場所をIntelliJに教えてあげれば良いです。

設定手順

0. IntelliJはパッケージの場所が分からないので解決できない

f:id:hogesuke_1:20140921165124p:plain

1. プロジェクトのツリーからModuleを選択しF4キー押下でProject Structureウィンドウを表示する

f:id:hogesuke_1:20140921165543p:plain

2. PlatformSettings → SDKs を選択する

3. SourcePathに環境変数"GOPATH"に設定しているパス配下のsrcディレクトリを追加する

f:id:hogesuke_1:20140921165126p:plain
取得したパッケージはGOPATHの配下に置かれている。


これで解決できるようになり警告も表示されないはず。
ちゃんと補完もできるようになるのでいい感じです。

はてブから2chまとめサイトエントリーを削除するchrome拡張

1年前に作ってずっと更新していなかったchrome拡張を久しぶりに更新しました。
せっかくなのでブログで紹介しときます。

対象ページ

削除対象サイト数

今カウントしてみたら、985サイトあった。
まだ生き残っているのはどれくらいあるのだろうか…。

Go言語にて依存関係を解決するためのimportにはアンダースコア(ブランク識別子)を別名とする

golangを触っていてなんだこれって思ったのでメモしておく。

importのアンダースコア

サンプルコードを見ていてこんな記述を見かけた。
パッケージ名の前にアンダースコアが書かれている。

import (
    "fmt"
    _ "github.com/go-sql-driver/mysql" // <- 先頭のアンダースコアはなにもの?
)

なにこれ?

これはブランク識別子と呼ばれるもので、importしたパッケージと依存関係のあるパッケージをimportするときにこれを指定するらしい。
golangではimportしたパッケージをコード中で使用しないとコンパイルエラーとなるので、依存関係を解決するためのimportであることを明示してあげないといけない。

インポート宣言は、インポート「する側」と「される側」の依存関係を宣言します。自分自身のパッケージをインポートすること、またはインポートしたパッケージ内でエクスポートされている識別子を一切参照しないことは誤った使い方です。インポートによる副作用(初期化)のためだけにパッケージをインポートするときは、パッケージ名としてブランク識別子を使ってください。

Go言語仕様翻訳(part12) - golang.jp

いいわけ

正直、ちゃんと読み取れてるか自信ないので間違った解説をしているかも。

参考

The Go Programming Language Specification - The Go Programming Language
Go言語仕様翻訳(part12) - golang.jp

改訂2版 基礎からわかる Go言語

改訂2版 基礎からわかる Go言語

prototype.jsのsetStyleで指定するcssプロパティ名にはハイフンを含めてはいけない

恥ずかしながらjQueryJavaScriptばかり触ってきたので、prototype.jsにおいては基本であると思われるところでハマってしまったのでメモしておく。

prototype.jsのsetStyleで指定するcssプロパティ名にハイフンを含めると、FireFoxにおいてスタイルが反映されない。

たとえば、background-colorを設定する場合、以下のように指定するとFireFoxには反映されない。

$('hoge').setStyle({ 'background-color': '#000000' });

ではどうするか。こうする。

$('hoge').setStyle({ 'backgroundColor': '#000000' });


ついでにjQueryではどうなるか実験してみたところ、FireFoxでもハイフン付きで問題なく反映された。

$('#hoge').css({ 'background-color': '#000000' });


ブラウザー間の微妙な動作の違いにはいつも悩まされる。

golangでxmlをパースする

Go言語でxmlをパースしようとしてけっこうハマったのでメモを残しておきます。

Xmlをパースする手順

1. 構造体を定義する

たとえばこんなxmlがあるとする。

str := `
<?xml version="1.0" encoding="UTF-8"?>
<Nicovideo>
    <thumb>
        <title>動画タイトル</title>
        <length>12:59</length>
    </thumb>
</Nicovideo>
`

そしたらこんな構造体を用意してあげる。

type Nicovideo struct {
	Thumb Thumb `xml:"thumb"`
}
type Thumb struct {
	Title string `xml:"title"`
	Length string `xml:"length"`
}

このとき注意することは2点。

  • 構造体のフィールド名を先頭大文字とすること
  • 構造体フィールド名とxmlの要素名が異なる場合(大文字小文字も区別される)は「'xml:"title"'」のようにどの要素を指すか明記する。

また、構造体を定義する際、欲しい要素がtitleだけであるなら、Lengthフィールドは定義する必要はない。

2. 構造体を初期化する

nicoXml := Nicovideo{Thumb{"", ""}}

3. パース関数を呼び出す

err := xml.Unmarshal([]byte(str), &nicoXml)

4. パースしたものを参照する

fmt.Println(nicoXml)
fmt.Println("title: " + nicoXml.Thumb.Title)
fmt.Println("length: " + nicoXml.Thumb.Length)

構造体を通してアクセスする。

サンプルコード

package main

import (
	"log"
	"fmt"
	"encoding/xml"
)

func main() {

	str := `
	<?xml version="1.0" encoding="UTF-8"?>
	<Nicovideo>
		<thumb>
			<title>動画タイトル</title>
			<length>12:59</length>
		</thumb>
	</Nicovideo>
	`

	nicoXml := Nicovideo{Thumb{"", ""}}
	err := xml.Unmarshal([]byte(str), &nicoXml)

	if err != nil {
		log.Fatal(err)
		return
	}

	fmt.Println(nicoXml)
	fmt.Println("title: " + nicoXml.Thumb.Title)
	fmt.Println("length: " + nicoXml.Thumb.Length)
}

type Nicovideo struct {
	Thumb Thumb `xml:"thumb"`
}

type Thumb struct {
	Title string `xml:"title"`
	Length string `xml:"length"`
}

いいわけ

構造体のフィールドを大文字始まりで定義するのは、Go言語の仕様で定められているのか、自分の使い方が悪いのかよく分かっていません。