toshihiko461-blog
toshihiko461-blog
takeshun's blog
40 posts
たけしゅんのブログ。 旧ブログから移転。 Web:takeshun.net
Don't wanna be here? Send us removal request.
toshihiko461-blog · 10 years ago
Text
karmaがインストールされない
正確にはインストールはされるが実行できないときのメモ。
sudo npm i -g karma
でインストールはされるんだけどいざコマンドをうつと
-bash: karma: command not found
とでてくる。再インストールやらなんやらしても改善されない・・・。ぐぐってみると答えがあった。流石のStack Overflow
sudo npm i -g karma-cli
上記コマンドをたたけばOK
0 notes
toshihiko461-blog · 11 years ago
Text
AngularJSで複数の非同期処理の終了を待つ
AngularJSで、複数の非同期処理の終了を待ってから処理をしたい場合のテスト。例えばresourceの取得が完了した後だったり、$timeoutが終了したあとだったり。場合によってはユーザの入力が終わったあとなんつーのもあるかもしれない(その場合この対応でいいのかやや疑問だが)
0 notes
toshihiko461-blog · 11 years ago
Text
Referencing DOM Nodes in Angular Expressions is disallowed
Angularjsで開発してたらこんなエラーが…。
Referencing DOM Nodes in Angular Expressions is disallowed
DOMの参照をAngular式の中で使うのは許可しない…!とのこと(だよね?)
ng-mouseover="onHover(this)"
$scope.onHover = (ele)->   ele.$element.removeClass("hoge")
なんじゃろなーって思ってたけど、coffeescriptだとdefaultでthisが追加されるから、最終評価であるremoveClassの戻り値(jqLiteのオブジェクト)がreturnされ、それがDOMの参照として評価されているんだろうな。
ってことで書き直した
$scope.onHover = (ele)->   ele.$element.removeClass("hoge")   return true
return trueを挿入してやった。これでエラーは消えましたとさ
追記:
まぁそもそもControllerでDOM操作をするなっチュー話で、Directiveを使うかmodelを噛ますかしましょう。
0 notes
toshihiko461-blog · 11 years ago
Text
GoogleSpreadSheetで複数のシートを削除する
GoogleSpreadSheetでドキュメントを管理していたのだが、ある日シートが追加できなくなった。どうやら制限があるらしい…。
のでそれはそれとして別に保存して��いて���シートを削除して制限を逃れようと考えた。新しいのを作ってもいいんだけどそれだと共有ユーザとか色々面倒臭いので…。
結論
GoogleSpreadSheetが提供している機能ではできません。ので、GoogleAppScriptを書いて無理やり消します。
ソース
function onOpen() { var arr = [ {name: "シート削除", functionName: "delete_sheet"} ]; var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); spreadsheet.addMenu("マイメニュー", arr); } function delete_sheet(){ var sS = SpreadsheetApp.getActiveSpreadsheet(); var sheets = sS.getSheets(); //削除したくないシート var preserveSheets = [ "format", "readme" ]; for(var i = 0;i<sheets.length;i++){ var checkSheetName = sheets[i].getSheetName(); var isPreserve = false; for(var j = 0;j<sheets.length;j++){ if(j == checkSheetName){ isPreserve = true; break; } } if(!isPreserve){ sS.deleteSheet(sheets[i]); } } }
シートの名前を取得する所と削除するところで一々通信が発生するので時間がかかるが、まぁ手作業でやるよりは早い。
0 notes
toshihiko461-blog · 11 years ago
Text
Windows7環境でgulpとbrowserSyncとjadeとstylus
Windows環境で~というほど特に違いはないんだけどWindows7で環境構築した備忘録。 使いまわせるようにかつあまり環境を汚さないようにgulp以外はlocalにいれるようにした。 かつ、あんまりCUIに慣れてない人向けに書いたつもり
インストールするもの
git
node.js
gulp
browser-sync
stylus
gulp-stylus
jade
gulp-jade
node.jsのインストール
http://nodejs.jp/nodejs.org_ja/docs/v0.10/
上記のサイトからインストールを押してぽちぽちするだけ。筆者DL時点ではv0.10.25。最近ではnode.jsを入れればnpmも入るんだね。
gitのインストール
http://msysgit.github.io/
上記サイトからDownloadおしてポチポチ。筆者DL時点ではGit-1.9.4-preview20140815.exe
ここから先はコマンドプロンプトを使います
ここはコマンドプロンプトでの作業
コマンドプロンプトとはスタートメニューのアクセサリの中にある黒い奴
まず開発環境を作りたいフォルダーを開く。 そこでShift + 右クリックを押すと出てくる「コマンドウィンドウでここを開く(W)」をクリックするとコマンドプロンプトが立ち上がる。 パスとかcdとかわからない人は上記操作で開いたコマンドプロンプトで行うように
リポジトリのクローン
git clone https://github.com/grazios/template.git cd template
gulpをインストール
npm i -g gulp npm link gulp
その他モジュールをインストール
時間がかかるかもしれない
npm i
実行
gulp
これでweb_publicの中身が更新されれば勝手にリロードされる。 jadeやstylusも入っているので基本的なことはできる。まだまだjshintとかbrowserifyとかconcatとか素敵モジュールは色々あるけどとりあえずこれで
0 notes
toshihiko461-blog · 11 years ago
Text
Apache - CGIを動かそうとしたらソースが表示された話
Ubuntu上Apacheでperlで書いたCGIを動かそうとしていつものように設定。
Direcotry指定してExecCGI書いてAddHundler書いてその他諸設定にパーミッションとかなんやらぽんぽんっと設定してはいアクセス。
…ソースが表示されるじゃねーか!
色々見直しをして再起動とかもしてみたりして…あ、まてよ?
a2enmod cgi
動きました…。
0 notes
toshihiko461-blog · 11 years ago
Text
OpenLayers3でKML Layerのオンオフ
http://takeshun.net/store/openlayers/addremove.html Mapに対してaddLayerなりremoveLayerなりを呼び出してやる。その時引数にはol.layerのClassを投げてやればいいっぽい。
var kml; var map = new ol.Map({ target: 'map', ol3Logo:false, view: new ol.View2D({ center: [0, -7], zoom: 20, }) }); function addLayers(){ kml = new ol.layer.Vector({ source: new ol.source.KML({ url: 'kml/box.kml' }) }); map.addLayer(kml); } function removeLayers(){ map.removeLayer(kml); }
0 notes
toshihiko461-blog · 11 years ago
Text
OpenLayers3-KMLでオリジナルIconを設定する
http://takeshun.net/store/openlayers/kmlicon.html http://takeshun.net/store/openlayers/kml/iconsample.kml
KMLLayerのPointをオリジナルのアイコンにする。
アイコン提供元:http://pictogram2.com/
0 notes
toshihiko461-blog · 11 years ago
Text
OpenLayers3-KMLでIconを置きまくってみる
置いた
2500ちょっと置いてある。描画に問題はなさそう。ピンがかけた表示になってるのは適当な設定してるからだと思う。自前のアイコンを設定してやったところ正常に表示された。
0 notes
toshihiko461-blog · 11 years ago
Text
OpneLayers3で自前の画像を背景に設定する
OpenLayers3においてTileとして画像を設定する時のメモ
<!doctype html> <html lang="en"> <head> <link rel="stylesheet" href="http://ol3js.org/en/master/css/ol.css" type="text/css"> <style> .map { height: 600px; width: 600px; } </style> <script src="http://ol3js.org/en/master/build/ol.js" type="text/javascript"></script> <title>OpenLayers 3 example</title> </head> <body> <h2>My Map</h2> <div id="map" class="map"></div> <script type="text/javascript"> var map = new ol.Map({ target: 'map', ol3Logo:false, layers: [ new ol.layer.Tile({ source: new ol.source.TileImage({ tileUrlFunction: function(obj){ return 'http://画像のURL'; } }) }) ], view: new ol.View2D({ center: [0, 0], zoom: 2 }) }); </script> </body> </html>
tileUrlFunctionのところで画像のURLを指定する。objにはズームレベルとか座標とかが入ってるのでURIを指定するときなんかにはこいつ��使う。
画像サイズ(というかTile)の調整方法などはまだ調査中…。
0 notes
toshihiko461-blog · 11 years ago
Text
GoogleMapsでRegion
GoogleMapsでRegion
GoogleMapsで、ある一か所を拡大すると詳しい内容がでてくるというのは良く目にするだろう。(e.g. 日本→東京→千代田区→上野→上野駅…)
それはRegionというものが設定されていて、一定の範囲(LatLonAltBox)が一定の大きさ(Lod)で表示されている場合に表示非表示を切り替えるという仕組みになっている。(https://developers.google.com/kml/documentation/regions?hl=ja
結論
GoogleMapsでRegionは動かない
いやいや何を言ってるんだと思うが本当に動かないのだ。GoogleEarthでは動くがGoogleMapsでは動かない。GoogleマップでサポートされているKML要素にもばっちり「あり」と書かれているのだが動かない。
皆悩んでる
Does Google Maps support KML regions?
Issue 332: Network link / Regions / LOD / google maps
does for regions work with google maps?
解決策
現在模索中、単純にお前KMLの書き方違うんだよ俺は動いてるぞとかいらっしゃったら教えてください。
0 notes
toshihiko461-blog · 11 years ago
Text
POSTとPUTの違い
先日受講生から「POSTとPUT、調べてみたけど違いがわからん!」と言われたので調べたメモ
前提
POSTもPUTもリソースを更新・作成することは認識している
RESTだとかURIとURLの違いだとかはわからない
作成処理の違い
POSTは新たにリソースを作成する。2回送信したら2個リソースが出来る。
Javaで書くとこんな感じ?
public int post(SomethingRequest request){ int response = 200; SomethingResource = null; try { //呼ばれるたびにインスタンスが作られる resource = new SomethingResource( request ); } catch ( Exception e) { response = 500;//めんどいので全部500 } //do something... return response; }
PUTは存在しなければ新たにリソースを作成する。2回送信しても1個のリソースが出来るだけ。
Javaで書くとこんな感じ?
public int put(SomethingRequest request){ int response = 200; SomethingResource resource = null; //Requestされたデータが存在するかチェック if( SomethingServer.isExists( request.resource ){ resource = SomethingServer.getResource( resuqst.resource ); } else { //無ければインスタンスが作られる try { resource = new SomethingResource( request ); } catch ( Exception e) { response = 500;//めんどいので全部500 } } //do something... return response; }
更新処理の違い
POSTは更新後の結果がサーバの状態に依存する。繰り返すと繰り返した回数だけサーバの状態が変化する
例えばこういう処理
public int post(SomethingRequest request){ int response = 200; try { //リクエストされたnumを加算 SomethingResource.hogeNum += request.num; } catch ( Exception e) { response = 500;//めんどいので全部500 } return response; }
PUTは更新後の結果はクライアント側が決定する。何回更新しても結果は同じ。
例えばこういう処理
public int put(SomethingRequest request){ int response = 200; try { //リクエストされたnumを設定 SomethingResource.hogeNum = request.num; } catch ( Exception e) { response = 500;//めんどいので全部500 } return response; }
参考
RFC2616 - Hypertext Transfer Protocol -- HTTP/1.1 9.5 POST RFC2616 - Hypertext Transfer Protocol -- HTTP/1.1 9.6 PUT 【読んだ】Webを支える技術 POSTとPUTメソッドの使い分け HTTPメソッドのPOSTとPUTの冪等性
0 notes
toshihiko461-blog · 11 years ago
Text
try-with-resourcesとScannerのメモ
Java7で新しく出てきたtry-with-resources文。これでScannerのインスタンスを生成した時にはまったメモ
try ( Scanner sc = new Scanner(System.in) ){ sc.next(); } catch ( Exception e ){ //do something... }
こんなコードを書くと、tryブロックを抜けた時にsc.closeがコールされる。その時に一緒に標準入力ストリームも閉じる(考えれば当たり前のことなのだが…)。
この部分をループしたりメソッド化して再度コールするとjava.util.NoSuchElementExceptionが発生する。
こうやってみると当たり前のことだなぁ…そういう部分こそはまるのだけれど
0 notes
toshihiko461-blog · 11 years ago
Text
Rebuildのまとめサイト作ったった。
きっかけ
宮川さんが提供しているPodcast「Rebuild」を先日人に紹介する機会があった。その時に「えーととりあえず○○見てみなよ!」とパッと伝えられなかったので、パッと検索できる仕組みを用意したいと思ったのが始まり。
「とりあえずnaoyaさんとかhakさんの回聞いておけば身近なネタが聴けると思うよ」という言い方とかした時に検索コストを負担させたくないしね。
作った
http://rebuild.takeshun.net/
使い方はまぁ、サイト見れば多分わかる
仕組みとか
CatalystとPerlのBatchで構築されてます。
Batch処理でRSSを解析し、サーバに蓄積して表示していますので、rebuild.fmの公開とは若干のラグがある可能性があります。
解析の中でSummaryにTwitterのアカウントが記載されている場合はゲストを自動取得しますが、それ以外のケース(4回目とか40回目とか)はゲストは手動で追加してやる必要があります。Show Notes自体は追加するんですけどね…。
Twitterアカウントは以下の方法で判別しています。
$_->get("itunes:summary") =~ /@([0-9a-zA-Z_]{1,15})/g;
余談
初めはRailsで構築しようと思ったのですがじっくり学びながらやる余裕がなかったので諦めました。
Debugにnaoyaさんのアカウントを使用したのですが、「伊藤 直也」がゲシュタルト崩壊しそうでした。
機械産業ビジネス論のレポートが絶賛死亡中です。
0 notes
toshihiko461-blog · 11 years ago
Text
Java - forの中で変数の宣言
Javaにおいて変数の宣言はコストになるのかどうかという話。インスタンスを生成しないケースに限る。
forの内部で変数を宣言
for (int i = 0; i < 50; i++){ int temp = a; a = b; b = temp; }
こういうパターンの時。tempの宣言を外に出したほうが早いんじゃないの?という意見が出ることがある。 実際にどうなっているのか逆アセして中身をみてみた。
検証に使ったバージョンはJava( 1.7.0_17 )
javap -cにて差を検証
検証に用いたソース
Test1
class Test1{ public static void main(String[] args){ int temp; int a = 5; int b = 3; for (int i = 0; i < 50; i++){ temp = a; a = b; b = temp; } System.out.println( "a:" + a + " b:" + b ); } }
Test2
class Test2{ public static void main(String[] args){ int a = 5; int b = 3; for (int i = 0; i < 50; i++){ int temp = a; a = b; b = temp; } System.out.println( "a:" + a + " b:" + b ); } }
逆アセした結果
Test2
Compiled from "Test1.java" class Test1 { Test1(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."":()V 4: return public static void main(java.lang.String[]); Code: 0: iconst_5 1: istore_2 2: iconst_3 3: istore_3 4: iconst_0 5: istore 4 7: iload 4 9: bipush 50 11: if_icmpge 26 14: iload_2 15: istore_1 16: iload_3 17: istore_2 18: iload_1 19: istore_3 20: iinc 4, 1 23: goto 7 26: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 29: new #3 // class java/lang/StringBuilder 32: dup 33: invokespecial #4 // Method java/lang/StringBuilder."":()V 36: ldc #5 // String a: 38: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 41: iload_2 42: invokevirtual #7 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; 45: ldc #8 // String b: 47: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 50: iload_3 51: invokevirtual #7 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; 54: invokevirtual #9 // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 57: invokevirtual #10 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 60: return }
Test2
Compiled from "Test2.java" class Test2 { Test2(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."":()V 4: return public static void main(java.lang.String[]); Code: 0: iconst_5 1: istore_1 2: iconst_3 3: istore_2 4: iconst_0 5: istore_3 6: iload_3 7: bipush 50 9: if_icmpge 26 12: iload_1 13: istore 4 15: iload_2 16: istore_1 17: iload 4 19: istore_2 20: iinc 3, 1 23: goto 6 26: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 29: new #3 // class java/lang/StringBuilder 32: dup 33: invokespecial #4 // Method java/lang/StringBuilder."":()V 36: ldc #5 // String a: 38: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 41: iload_1 42: invokevirtual #7 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; 45: ldc #8 // String b: 47: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 50: iload_2 51: invokevirtual #7 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; 54: invokevirtual #9 // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 57: invokevirtual #10 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 60: return }
見た感じ
一つわかったことは逆アセした結果をみてもよくわからんということ。(僕の知識不足)
でも変数宣言時に何かしているようには見えないのでforの内部で宣言する(=スコープの局所化最優先)で何も問題がないように思う。
for内部でのデータ取得先が異なるくらいだし、istoreとistore_nでそこまで差が生じるとは思えない。ただistoreのほうが参照する分1step多いのかな?
しかしその1stepのために可読性・保守性を犠牲にするのはなぁ…。ちなみにwhile( true )とするとほぼ同一のバイトコードが出力される。
0 notes
toshihiko461-blog · 11 years ago
Text
VBScriptで非同期処理をループする
本日大変レガシーなシステムに触れる機会があり、ASP(.NETではない)などをちょこちょこ弄っていました。 んで非同期通信できたら楽だなーって処理があったので調べたときのめも
なお僕はASPとASP.NETの違いもわからんし、VBScriptって何だよっていうぐらい触れていないエンジニアなので記述方法やらが変かも
まずはループ処理
Dim timer If IsEmpty( timer ) Then timer = setInterval ("GetWorkState()",1000) 'タイマーの作成
IsEmptyでいいのかとかSubの名前がGetWorkStateでいいのかとか色々あるけど、基本的にはこれで1秒間隔でループ。基本的にJSと一緒だね
timerの宣言をグローバルにすることを忘れないように!
通信処理
Sub GetWorkState() Dim myHttpRequest Dim myURL Dim myPostData Dim strResult myURL = "http://yahoo.co.jp" Set myHttpRequest = CreateObject("MSXML2.XMLHTTP.3.0") Call myHttpRequest.Open("GET", myURL, False) Call myHttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded") Call myHttpRequest.setRequestHeader("If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT") 'Queryを追加するときはSendの引数に[hoge=fuga&fizz=buzz]のように文字列を渡せばOK Call myHttpRequest.Send() strResult = myHttpRequest.responseText MsgBox( strResult ) '解放 Set myHttpRequest = Nothing End Sub
これでYahooのソースがMsgBoxとしてでるよ。
タイマーをクリア
clearInterval(timer) timer = Empty
timerを引数にclearIntervalを呼び出すことでループ終了。そんでtimerにEmpty値を入れることで次に備える感じ。いじょ
0 notes
toshihiko461-blog · 11 years ago
Text
Oracleのマテビューで完全リフレッシュ時にORA-1555
OracleでマテリアライズドビューをDBLinkを用いて作成し、それを完全リフレッシュしようとしたときにORA-1555で失敗した時の原因と対処法。
はじめはUNDO表領域が不足しているのかと思ったけどちょっと別の問題だった
原因
SCN (System Change Number) のズレ
マテビュー側のSCNが1だとして、マスター側のSCNが先行して5とかだった場合、 完全リフレッシュをかけた時に、SCNが古すぎてORA-1555が発生する!
SCNはトランザクションの前後とSelectの後に同期されるので、完全リフレッシュ失敗のトランザクションが終了した時にSCNが同期する。つまりもう一度実行すると正常に同期される。
対応
完全リフレッシュを行う前にSelectを投げる。
CREATE OR REPLACE PROCEDURE sync_ref(mv_name VARCHAR2) IS dummy NUMBER; BEGIN SELECT COUNT(*) INTO dummy FROM dual@<DBLINK名>; DBMS_MVIEW.REFRESH(mv_name, 'C'); END;
参考
http://www.shift-the-oracle.com/oerrs/ora-01555.html
0 notes