それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Javascriptで文字列の0埋め、空白で右寄せでフォーマット

Javascript で sprintf( "%04d" 987 ); をやりたいと思った

var i = 123
( "000" + i ).substr(-4) //=> 0123

なるほど! substr と組み合わせればいいのか

> ( ("000") + 1 )
'0001'
> ( ("000") + 1 ).substr(-1)
'1'
> ( ("000") + 1 ).substr(-3)
'001'
> ( ("000") + 1 ).substr(-4)
'0001'
> ( ("000") + 10 ).substr(-4)
'0010'
[1,2,3,4,5,6,7,8,9,10].
map(function(e){return e*e*e ;}).
map(function(e){
   return ("000" + e).substr(-4) 
}).join(" ")

//=>'0001 0008 0027 0064 0125 0216 0343 0512 0729 1000'

文字列の右寄せについても、空白を入れるだけだから

実行結果。

str = [1,2,3,4,5,6,7,8,9,10].map(function(e){return e*e*e}).map(function(e){ 
   return ("   " + e).substr(-4) 
}).join("\n")
console.log(str)
/*
   1
   8
  27
  64
 125
 216
 343
 512
 729
1000
*/

美しい!

右寄せと、0パディングのためだけに、外部ライブラリを script タグでツッコムの嫌だったんですよね。これで楽になりそうです。

コレを使いやすく( 2016/06/04 追記)

Number.prototype.format = function(char, cnt){
  return (Array(cnt).fill(char).join("") + this.valueOf()).substr(-1*cnt); 
}

(100).format("_",5) //=> "__100"
(-1).format(" ",5)    //=> "   -1"
23..format(" ",5)    //=>"   23"

これで、数字の右寄せや、0埋め、printf っぽいことが出来るよね。

ちなみに通貨などは

Intl.NumberFormat

Intl.NumberFormat - JavaScript | MDN

コレを使って金額はぱぱっと処理できる

var number = 123456.789;
console.log(new Intl.NumberFormat('ja-JP', { style: 'currency', currency: 'JPY' }).format(number));
// → ¥123,457

何でもかんでも npm に頼るのは良くないよ。

参考資料

書式化文字列 (format / sprintf) | hydroculのメモ

関連資料

Array(10) がundefined になる問題。 - それマグで!

Javascript で、 1.1.1.toString() #=> 1 なのですが 1.toString… - 人力検索はてな

AppleScript のJavaScript版 JXAで、起きない友達をバンバンする

待ち合わせに来ない、、、

友人が寝てて待ち合わせにこないので、iMessageを使ってバンバンしたらどうだろうと思って作ってみた。

var mes = Application("Messages")
chat = mes.chats.byId("iMessage;-;+819012345678")


for( var i =0; i<10;i++){
    mes.send("あの、いつになったら起きるんですか", {to:chat})
    delay(1)
}

for( var i =0; i<10;i++){
    mes.send("ずっとまってるんですけど", {to:chat})
    delay(1)
}

スクリーンショット 2014-12-03 23.07.39

自分宛てに、1000通ほど送ってみたが、delay( 1 ) 1秒おきにメールを送っていると、さすがに頻度が高すぎるので、もう少し頻度や件数を落とさないと余計に喧嘩になりそうだということがわかった。

あと、余り多数送りすぎると、SPAM業者としてAppleID剥奪されそうなので、無茶はできない。

これは Javascript for OSX Autiomation の記事まとめの1つです。

Javascrript for OSX Automation アドベントカレンダー - それマグで!

Safariの自動操縦 (JXA: JavaScript for OSX Automation)

前回のハローワールド

JavaScriptでハローワールドして、とりあえずメッセージの送って遊びました。

AppleScript のJavaScriptでハローワールド - それマグで!

メッセージ.app でバンバン

AppleScript のJavaScript版 JXAで、起きない友達をバンバンする - それマグで!

今回は、ちゃんとまともに使える作業をしていきたいと思います。

Safariの自動化

スクレーパーを書くのもHeadlessなPhantomJSも、Seleniumも面倒なときはSafariIEの自動化で済ませたほうが楽な時があります。

PhantomJSとかコールバック地獄で素で書くの苦行だったのでもう使ってない。

Safariウェブサイトにアクセス(by JavaScript for OSX automation)

Safariを起動して、特定サイトにアクセスします。

app = Application('Safari')
app.includeStandardAdditions = true
app.activate()

var tab = app.windows[0].tabs[0]
tab.url = "http://pixiv.net"

これで、Safariを起動してサイトが開きます。

Pixivが開きました。

13

上手くいかない時は、ほんの少しだけウエイトをかけて、Safariの起動を待ちをしてみます。

app = Application('Safari')
app.includeStandardAdditions = true
app.activate()

delay(0.3)// 若干のスパイス

var tab = app.windows[0].tabs[0]
tab.url = "http://pixiv.net"

次に次に、サイトを切り替えてみます。

app = Application('Safari')
app.includeStandardAdditions = true
app.activate()

var tab = app.windows[0].tabs[0]

tab.url = "http://mixi.jp"
delay(3.0)
tab.url = "http://pixiv.net"
delay(3.0)
tab.url = "http://twitter.com"

ほとんどのサイトは2秒以内に表示されるので、3秒程度のウエイトを入れると上手く動きます。

ページの自動更新

今見ているページを自動更新したい時があります。

スポーツを見ていたり、プログラムをから送信したデータの反映待ちをするなど、自動更新って結構便利に使えます。

app = Application('Safari')
app.includeStandardAdditions = true
app.activate()
delay(1.0)
var tab = app.windows[0].tabs[0]

while(true){
  tab.url = "http://twitter.com/"
  delay(5.0)
}

Safariを自動化するとスクレーパー書かずにすみます。

SafariIEをパパっと自動化出来ると、省力化出来て便利です。

次回は、delay(3.0)でロード待ちをしていたところ、ちゃんとページロードを待つようにしたいと思います。

備考

この記事はJAXのアドベントカレンダーの2日目として書きました。