2ちゃんねる ■掲示板に戻る■ 全部 1- 最新50    

JavaScript情報交換所(プログラミング既習者専用)

1 :デフォルトの名無しさん:2015/12/07(月) 07:26:33.87 ID:NYLGCW0V.net
実際にJavaScriptを書いている人の情報交換所です。
プログラミング既習者専用です。初心者の方はご遠慮下さい。
玄人の方、歓迎致します。

45 :44:2016/02/08(月) 23:02:40.71 ID:vWC/lFUG.net
あ、ちなみに、表示してる緯度経度は日本測地系です。
漁業用のGPSが今もみんな日本測地系を使ってるので。
携帯もスマフォもGoogleMapも世界測地系なので変換してます。

46 :デフォルトの名無しさん:2016/02/09(火) 23:20:54.03 ID:JuURpG1d.net
>>44
見た。
てか、きっちり書いてあるなあ。

Cから見ればJavaScriptなんて超大富豪プログラミングだからね。
ただ、JavaScriptのユルさはなかなか良いとは俺も感じる。
ブラウザでお気軽GUIできるのもいい。

とはいえ、その規模で収まっているうちはいいが、
これからバシバシ機能追加していくのなら、JavaScriptのアレな点が見えて嫌いになるかもw

47 :デフォルトの名無しさん:2016/02/10(水) 09:11:00.33 ID:FkM1RfeE.net
>>46
JavaScriptは今じゃ、ブラウザの言語でとどまってないからね。

1.Electronでマルチプラットフォームアプリを作成できる
2.CordovaでiOSやAndroidアプリを作成できる
3.Node.jsを使って、Raspberry Piのようなハードウェア制御ができる
4.同じくNode.jsを使って、PHPの代わりにサーバサイドの制御ができる

1粒で5度美味しいプログラミング言語です。緩いが故に大変な部分も
あるけれど、基本的にはライブラリを活用する事でその辺を軽量化でき
るしね。

48 :デフォルトの名無しさん:2016/02/11(木) 01:04:16.07 ID:3e/IE9s+.net
>>47
嫌いな人も多いが、俺もnodejsの便利さにいまさらびっくりしてる。
eureca.io使って、クライアントとサーバが双方まるで直接呼んでるみたいにfunction呼び出しして、あまつさえコールバックまで出来るとは、とビビるくらい。

49 :デフォルトの名無しさん:2016/02/11(木) 09:19:41.38 ID:pPotq0xY.net
>>48
言語の弱点をライブラリ群がカバーしてくれてるから、助かるよね。
支持されていなかったら、そのライブラリ達もいないわけで。

50 :デフォルトの名無しさん:2016/02/11(木) 16:07:05.01 ID:3e/IE9s+.net
>>49
あとは、プロトタイプベースで魔改造する余地があったのも大きいのかも。
普通の言語で、基底クラスを基底クラスのままメソッド追加するとか、上書きする、なんて今までの言語では頭おかしいって言われそうなユルさかつ、
言語仕様としてシングルスレッドじゃん→なんかコールバックさせる仕組みを外に持たないとね→実装
みたいな魔に魔を重ねた改造の結果、使いやすくなってるような気がする。

51 :44:2016/02/12(金) 01:30:54.19 ID:ZoV9Wx9d.net
>>46
距離を計算するGoogleMapsライブラリに
グローバルで保持してる中心座標を渡したらエラー。。。
new 座標(global中心座標)して渡したら通る。。。どういうこと?

っていうか、渡す時も、受け取る時もnewしないとエラーが出ることがあるんだけどなんだこれ・・・
javascriptの仕組みを理解できてないね・・・orz

newで受け取った値を代わりに使ったら、前の値はメモリに残るだろうし
ガーベージコレクションは自分でしないといけないのかなぁ。
富豪だし無視してもいいかなぁw

もうちょっと遊びながら勉強してみます(汗

52 :デフォルトの名無しさん:2016/02/12(金) 08:43:48.25 ID:eUWMATXs.net
>>51
new Dateと同じだろ。

日付に見えてただのテキスト型になってるとかそういう事。なので、明示的に
型変換して入れてやる事はままある。


53 :デフォルトの名無しさん:2016/02/12(金) 20:46:32.04 ID:jzfCjOnO.net
>>51
物があるんだから具体的に何行目って言ってくれた方が分かりやすいとは思うけど、
見た目多分>>52であってる。
俺もそんなに詳しい訳じゃないし、APIの仕様も知らないけど。

ガーベッジコレクション(GC)をユーザが起動する方法はない。
参照が切れればいつか勝手に回収される。
ただ、見た目バカスカリークする可能性があるタイプのプログラムじゃないから、
多少リークしていたとしても問題ないと思うけどね。

リークが気になるなら、chromeならDeveloperTool、FFならabout:memoryで確認できる。
ちなみにそこにGCするボタンもある。

54 :デフォルトの名無しさん:2016/02/12(金) 23:30:42.28 ID:ZoV9Wx9d.net
>>53
// グローバル変数
var currentPos = new google.maps.LatLng({lat: 32.xxx, lng: 130.xxx});

//---------------------------------------------------------------------
// watchPositionSuccessCallback() 現在位置取得Success
//---------------------------------------------------------------------
function watchPositionSuccessCallback(pos) {
 currentPos = {lat: pos.coords.latitude, lng: pos.coords.longitude}; // あ、これがダメなのか?ここでnewしろと?
 var from = new google.maps.LatLng(currentPos); // ここで from に new しないで
 var to = google.maps.geometry.spherical.computeOffset(from, 350, heading); // 直に currentPos を使うとエラーが出ます

currentPos = {lat: a, lng: b};
って構文は
currentPos変数が保持してるLatLngオブジェクトのlatにaを代入、lngにbを代入する、
って思ってたんだけど違うのかなぁ?

ガベコレに関しては、ググると、
意図的にnullを代入すればメモリから消される、的なことを見たのだけどめんどくさいですよね。
上の例だと、
currentPos = null;
currentPos = new google.maps.LatLng({lat: 32, lng: 130});
最近のPCやスマフォはメモリ数GBとかあるしもう忘れることにしますw
きっとガーベージが増えたらGoogleChromeさんが勝手に掃除してくれますよね!

55 :デフォルトの名無しさん:2016/02/13(土) 00:01:10.41 ID:lKczJ9J0.net
>>54
currentPos={...}は、そのまんまcurrentPosに{...}を代入するだけで、
それぞれのプロパティに代入してくれるわけじゃないよ。
{...}自体が、new Object()だしね。
ガベコレが回収してくれるには参照を切ってやらなきゃならんのだから、null代入は必須。
意図的にnullを代入するとガベコレが回収する訳じゃないけど。
グローバル変数のcurrentPosはLatLngなんだから、{}でつっこむほうが間違ってる。

56 :デフォルトの名無しさん:2016/02/13(土) 00:40:54.25 ID:o8xzA50z.net
>>55
レスthxです。

プロパティに代入しちゃえ!って
currentPos.lat = pos.coords.latitude;
currentPos.lng = pos.coords.longitude;
やってみたけどできないのね。
https://developers.google.com/maps/documentation/javascript/reference?hl=ja#LatLng
LatLngってオブジェクトはコンスタラクタ以外では値の設定ができないのかな?
富豪過ぎるwww

>{...}自体が、new Object()だしね。
>グローバル変数のcurrentPosはLatLngなんだから、{}でつっこむほうが間違ってる
うーん、イマイチ理解できてないですけど、
currentPos = new Object({lat: a, lng: b});
というlatとlngを持ったLatLngではない別のObjectが生成された、ってことなのかな?

型が緩いのは便利だけどデバッグ時にはわかりにくすぎるという諸刃の剣ですね。。。
勉強になりました。ありがとうございます!

#今回javascriptで組んでみて、CSSにも苦戦してるし、CSSとjavascript上のひも付けにも苦労してます(汗
#あぁあああなんでぇええ  って腹たつけど、意図的に動いた時にはやっぱり嬉しいですよね
#プログラミングって楽しいですよね!

57 :デフォルトの名無しさん:2016/02/13(土) 01:31:30.78 ID:rQhUa0HJ.net
>>54,56
既に指摘されているとおりだけど、

> currentPos = {lat: pos.coords.latitude, lng: pos.coords.longitude};

> currentPos = new Object({lat: a, lng: b});
> というlatとlngを持ったLatLngではない別のObjectが生成された、ってことなのかな?
これで理解はあってます。

> currentPos = {lat: a, lng: b};
> って構文は
> currentPos変数が保持してるLatLngオブジェクトのlatにaを代入、lngにbを代入する、
> って思ってたんだけど違うのかなぁ?
これは違う。分割代入の構文はまた別にある。
この構文だと新しく lat と lng を持ったオブジェクトが作られる。currentPosに入っていた物は捨てられる。
(正確に言うと参照が切れる。全てから参照が切れていればいつかGCされる)

型は無いようで有るというか、C的に言えば全部ただのオブジェクトでしかないのだけれど、
new するとコンストラクタが呼ばれ、結果的に初期値等が設定され、
さらにプロトタイプも設定される。
また、getter/setterやProxyとかで色々細かいことも出来てしまうので、
API で new しろと言われている以上 new しないと駄目。
(Webの場合はURLで引っ張っているので、対象が書き換えられたらいきなり更新される。
そのリンクだと多分バージョン固定だからこの点は大丈夫だと思うけど、
APIはAPI通り使わないと危険。)

> 最近のPCやスマフォはメモリ数GBとかあるしもう忘れることにしますw
GCして欲しいのならnull代入するなりdeleteするなり関数で囲って関数ごと捨てるなりするしかないけど、
正直、今回のような場合の1個や2個はどうでもいいと思う。

> CSSとjavascript上のひも付けにも苦労してます(汗
基本的にclassを使えばいい。

58 :デフォルトの名無しさん:2016/02/13(土) 01:57:33.47 ID:rQhUa0HJ.net
> #プログラミングって楽しいですよね!
正直、ブラウザ上でのプログラミングはかなり楽しいと思う。
GUIで具しか書かなくていいのでチャキチャキ感があっていい。
ただ、他の新しいGUIは知らないから、他にもいいのがあるかもしれないけど。

59 :デフォルトの名無しさん:2016/02/13(土) 03:17:29.54 ID:o8xzA50z.net
>>58
色々教えてくださってありがとう御座います。

ブラウザ上のプログラミングも楽しいですけど、
PC8801mkII-SRからプログラミングを始めた私としては、
限られたCPU速度、メモリー、直接ハードを叩いてる感、も楽しかったんですよ
V-Sync割り込みで画像移動させるとスムーズに動くとかね。

そういうハードの限界まで頑張る、的な楽しみは今では無いでしょうけど
Google Chromeには便利なデバッガーあるし、
ネット上には情報がいっぱいあるし、
今の若い人たちはjavascriptから遊んでもいいと思いますね。
html5のcanvasでゲームも作れるし。
文法的にはCにもjavaにも似てるからどこにでも進めるでしょう。
職業:プログラマーという選択が良いか悪いかは別としてねw
趣味:プログラムなら一生楽しそうだけどなぁ。

60 :デフォルトの名無しさん:2016/02/13(土) 03:40:04.40 ID:o8xzA50z.net
雑談ついでに。
私はプログラムはXyzzyで書いてます。
Windows用の軽いemacs互換エディタです。
http://www13.plala.or.jp/tarna/maps/ariakekai/icon/xyzzy.png
25年くらい前にX68000でTinyEmacsを使い始めてから、
もうemacsキーバインドじゃないと何も書きたくないです。
ゲーマーなんでWindowsを使ってますが、
Xkeymacsという、すべてのキーバインドをemacs風に変換するソフトが常駐してますw
今の環境はWindows7ですがWindows10にしたらXkeymacsが使えなさそうで怖いです。
最低Ctrl-H=Backspaceにできないと死にます。

スレチ、失礼しました。

61 :デフォルトの名無しさん:2016/02/17(水) 19:47:14.33 ID:aoSk7bCH.net
今更ながらjs2-mode導入して色を付けてみたが、ちょっとイマイチだな。
キルリングの取り扱いが変わっていて慣れないし、
括弧閉じてもインデントが上がってくれない。
括弧の対応がハイライトされないのも謎だ。
まあもう少し使ってみるけど。

ただ、書いている最中に構文チェックするらしくて色が変わる。
これ自体は便利だと思うけど、どこまで使えるものなのかはまだよく分からない。

62 :デフォルトの名無しさん:2016/02/21(日) 09:27:40.55 ID:lDbEdv1b.net
>>57
>>GCして欲しいのならnull代入するなりdeleteするなり関数で囲って関数ごと捨てるなりするしかないけど
それらでCGされる保証はない
エンジンは一般的な場合に最適化されてる
一般的でないことはしないのが基本

63 :デフォルトの名無しさん:2016/02/24(水) 01:04:57.69 ID:idPWr2uv.net
すいません、キルリングの仕様変更はemacs23からのものらしく、
js2-modeは関係ありませんでした。

括弧の対応のハイライトはやはりおかしいままですが、
対応が間違っている場合はそもそも色が変わるので、
結果的にはあまり問題はないですね。

64 :デフォルトの名無しさん:2016/03/28(月) 23:29:32.90 ID:JoYhD075.net
nodeスレより
http://yosuke-furukawa.hatenablog.com/entry/2016/03/27/152500

65 :デフォルトの名無しさん:2016/04/13(水) 23:34:15.51 ID:/QwzOlsU.net
textContentってquerySelectorで引っかけられないよね?とりあえず

Array.prototype.filter.call(src.getElementsByTagName('a'),function(dom){return dom.textContent==='XXX';})[0];

で取り出せるんだけど、もう少しましな方法って無いかね?(速度および見た目的に)
条件は、

1. <a>は10個くらいで、5〜6番目が引っかかるので、そこでショートカットしたい。
2. 取り出すのは最初の1個でいい。

66 :デフォルトの名無しさん:2016/04/19(火) 11:57:14.77 ID:/d/wYc3X.net
速度も見た目も十分だよ
それを何度も実行する気なら状況によって要素や文字列をキャッシュすればいいし、
もっともっと短くしたいのならES2015を使えばいい

67 :デフォルトの名無しさん:2016/04/19(火) 21:54:42.16 ID:18lMfaYE.net
テーブルに大量の行を挿入したい時とかって普通にやると応答止まるけどプロはどうやってんの?

68 :デフォルトの名無しさん:2016/04/20(水) 01:37:27.97 ID:wi2IeNzq.net
>>66
本当は、

querySelector('a[textContent="XXX"]')

と書きたいところだ。
ただこれは出来ないので、これまでは致し方なく別関数なりベタで書いていた。
しかし call に慣れてくると実は意外と使えることに気づく。
使い道の無かった filter も便利に使えるかと思ったのだが、
配列メソッドなのでショートカットが無いのが唯一残念なところだ。
(個人的には記述量は気にならない。)

69 :デフォルトの名無しさん:2016/04/20(水) 01:44:58.86 ID:wi2IeNzq.net
>>67
大量の行の挿入くらいじゃ止まらないし、
そもそも一画面分以上挿入する必要もないだろ。

具体的に何行挿入して、どれくらいカクついたらアウトなのよ?

70 :デフォルトの名無しさん:2016/04/20(水) 08:04:48.78 ID:M3votfED.net
requestIdleCallbackで分割しながら挿入すれば良し

71 :デフォルトの名無しさん:2016/04/20(水) 09:52:44.31 ID:98a+yUuB.net
vol.119で質問すれば良いのになぜこんな場所で質問してるのか
ここで詳しく回答する気は起きないので簡単にしかいわんけど
http://echo.2ch.net/test/read.cgi/tech/1457452716/

>>65
XPathを使えば良いと何度もいわれてる

>>67
1行ずつ何度も挿入してるんだろ
DFを使え

72 :デフォルトの名無しさん:2016/04/25(月) 00:30:16.00 ID:th/2rgKP.net
ふと思ったんだが、forEach って何で currentValue が this になるのがデフォじゃないんだ?
グローバルじゃ意味無いよな?
引数で与えられるから動作としては問題なく、見た目だけの話だけど。

> forEach に thisObject パラメータが与えられると、callback の呼び出しのたびにそのオブジェクトが this として使用されます。thisObject が与えられないか null だと、callback に結び付けられたグローバルオブジェクトが代わりに使用されます。
> https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

73 :デフォルトの名無しさん:2016/04/25(月) 04:01:16.41 ID:LMKLsb3i.net
thisに色んな意味を付けて何でもかんでも与えるなんてセンス無いから
現にアロー関数だったとき機能しないでしょ

74 :デフォルトの名無しさん:2016/04/25(月) 04:10:55.58 ID:wavxOtJH.net
>>732
currentValue が thisになるのなんて、
DOMのイベントハンドラの中でthisが要素になるぐらいのもんだろ。
そもそもDOMはJavaScriptではない。
そもそもDOMがおかしいんだよ。

75 :デフォルトの名無しさん:2016/04/25(月) 08:11:57.07 ID:th/2rgKP.net
>>73
> 現にアロー関数だったとき機能しないでしょ
あれはどっちかというと無駄な仕様変更だと思うが。
正確に言うと無駄な仕様を削除して新しく自動 .bind(this) に変更したわけだが、
その必要も無かった(と思う)

>>74
> そもそもDOMがおかしいんだよ
これはそう思う。というか、あれは this になることで無駄な手間が増えてる。
イベントハンドラを継承で与えるとき、(クラスでイベントハンドラを共有するとき)
いちいちインスタンスに bind しなくてはならないので面倒だ。
必要なら e.currentTarget でよかったのに自動 this だからこうなる。

ただここら辺も統一感がなくてイマイチではあるが、
現実的には何とかなる範囲ではあるので、(我慢できる範囲)
AltJSもイマイチ本家を殺しきれないといったところか。

76 :デフォルトの名無しさん:2016/04/25(月) 17:28:53.92 ID:q4sdOoqx.net
>>72
Array#forEachのコールバック関数にcurrentValueをthis値束縛する動作が自然ではなく、それによるメリットもないからだ
prototype上のメソッドでもないただのコールバック関数がなぜarrayでもグローバルオブジェクトでもなく、cirtentValueに束縛するのだ?
Function#bindでthis値を1に変更した場合、全ての要素値が1と扱う実装に利便性があるとは思えない
(arrayに束縛するならわからんでもないが)
forEachは第3引数でコールバック関数のthis値を指定できるが、これは異なるスコープからデータを渡すのに便利だ
(jQuery#eachにはこの機能はない)

イベントハンドラ関数のcutrentTargetへのthis値束縛もDOM3までは存在せず、DOM4で実装から逆輸入して規定されたものだ
addEventListenerには元々、handleEventでthis値を束縛する機能があり、thisをcurrentTargetとして扱うコードはhandleEventを利用した途端に修正を迫られる
event.currentTarget === this は相互運用性の為に仕様に取り込まれたに過ぎない
ちなみに、jQueryではhandleEventを利用出来ない

jQueryがthisを多用するのは仮引数を書く手間を減らす為だけに定められた歪なものだ
ECMAScriptでは関数呼び出しされるまでthis値が定まらない不定値だが、jQueryはthisをローカル変数でも引数でもない第三の格納倉庫として利用し、コード上でthis値が変更されることを許さない
this値に変更されて困る重要なデータを格納するのが当然と思う風潮が一部で生まれている気がしないでもない

77 :デフォルトの名無しさん:2016/04/25(月) 17:47:23.15 ID:6VBDo1JK.net
>>75
仕様「変更」ではない
アロー関数はより「ピュア」な新たな関数
newも出来ないし、thisやsuperも変数と同じように参照する
bindとは違う
統一感はある
DOMは関係ない、altJSでも同じこと
というかデファクトであってそれに依存するのは非推奨

78 :デフォルトの名無しさん:2016/04/25(月) 19:33:42.57 ID:th/2rgKP.net
>>76
指摘の通りDOMをイメージしていて、
これまた指摘の通り全部thisでやろうとすること自体が糞だと理解した。

> (arrayに束縛するならわからんでもないが)
確かにこちらの方が自然だね。(とはいえthisにこだわるのが間違いだったが)

> event.currentTarget === this は相互運用性の為に仕様に取り込まれたに過ぎない
見た目相互運用できるようには見えないが、
(thisに揃えても同じコードを再利用できるとは思えない。もちろん揃えないよりはマシだが)
後付けでいろいろ奇妙になっているのは理解した。
> http://7cc.hatenadiary.jp/entry/eventlistener-handleevent

> this値に変更されて困る重要なデータを格納する
jQueryは知らないが、これはconstの代りに使うということか?
アクロバティック過ぎる。


>>77
> アロー関数はより「ピュア」な新たな関数
つまり機能限定版か。
そういう理解は出来なくもないが、導入するメリットは文字数以外に何もないだろ。
そりゃ意味無いって普通は言われるよ。
どうせ新規にするのなら、クロージャ無しとかまで踏み込んでもよかった。
(新規なら使い分けが必要/有効なところまで機能分離するべき)

79 :デフォルトの名無しさん:2016/04/25(月) 22:39:46.80 ID:wavxOtJH.net
>>76
> jQueryがthisを多用するのは仮引数を書く手間を減らす為だけに定められた歪なものだ

違うよ。DOMの仕様に合わせただけ。

jQueryのイベントハンドラは、DOMのイベントハンドラと
互換性を考慮されて作られている。

例えば、この2つは同じように動く

$('#btn').on('click', function(event) {
 alert(this.id + event.currentTarget.id)
});

document.getElementById('btn').addEventListener('click', function(event) {
 alert(this.id + event.currentTarget.id)
});

どちらのイベントハンドラもthisは同じものを指しており、
またjQueryのeventオブジェクトはDOMのeventオブジェクトの仕様と
互換性を持たせて実装されている。

高い互換性ではないが、それでも程度はあるから移行が楽になる。

80 :デフォルトの名無しさん:2016/04/25(月) 22:47:27.73 ID:wavxOtJH.net
>>76
> jQueryはthisをローカル変数でも引数でもない第三の格納倉庫として利用し、コード上でthis値が変更されることを許さない
> this値に変更されて困る重要なデータを格納するのが当然と思う風潮が一部で生まれている気がしないでもない

そんなことしません。

そう言う用途として使うのは、DOM要素のdatasetだよ。
このdatasetっていうのは比較的最近できたもので昔はなかった。

だけどjQueryは要素ごとの情報の格納場所の必要性を昔から認識していたため
datasetが作られるよりも前からdata()メソッドと言うのを持っていた。

そしてdata()メソッドがある理由の一つとして、
thisに直接値を格納するとブラウザのバグでメモリリークになる可能性があるから
「this(DOM要素)にデータを格納してはいけない。」と言っていたぐらいだ。

事実はあんたが思っているのと正反対だよ。

81 :デフォルトの名無しさん:2016/04/25(月) 22:49:10.70 ID:wavxOtJH.net
これね。

https://api.jquery.com/data/

The .data() method allows us to attach data of any type to DOM elements in a way that is safe from circular references and therefore from memory leaks.

82 :デフォルトの名無しさん:2016/04/25(月) 23:32:07.55 ID:olQI0pZ8.net
>>76でhandleEventの話が出ているが、使った人ならわかると思うが、
handleEventはswitchでイベントを振り分ける必要があって使いづらい。

なぜこんな仕様があるかというと、そもそもDOMはJavaScript以外の言語も
考慮されて作られているという事実で説明できる。

つまり関数の引数、つまりaddEventListenerの引数に関数を渡せない言語が存在する。
具体的に言うとJava。Javaでは引数に関数を指定することができず、
オブジェクトは指定できる。

handleEventインターフェースを実装したオブジェクトを引数に取る関数と
考えるとhandleEventという仕様がなぜ存在するかがわかる。
これは便利だから追加された機能じゃない。Java等で必要だったっから
追加された仕様であって、JavaScriptでは関数をそのまま指定した方がいい。

83 :76:2016/04/26(火) 00:48:49.99 ID:74Un+zc0.net
>>78
> > event.currentTarget === this は相互運用性の為に仕様に取り込まれたに過ぎない
> 見た目相互運用できるようには見えないが、
document.all が標準化されたのと同じ理由だが、既存の資産(this で event.currentTarget を参照するコード)を生かす為だ
DOM3当時はデファクトスタンダードとして this 値が event.currentTarget を参照していたが、標準化されていなかったので確実に動作する保証がなかった
DOM4で標準化された事で既存のコードが確実に動作する事が保証された
単純に相互運用性を考えるなら event.currentTarget を使ったほうが良いのはいうまでもないが、
IE6の影響でXHTMLへの移行が進まなかった教訓を得てバッドノウハウでも積極的に取り入れて互換性を確保する方向にシフトした

> > this値に変更されて困る重要なデータを格納する
> jQueryは知らないが、これはconstの代りに使うということか?
これは言葉足らずだった、すまん
先述の jQuery.each と同じだ

// bad
jQuery.each([1, 2, 3], function (i, value) {
console.log(this); // Strict Mode なら Number型、sloppy mode なら Object 型 (Function#bind で変更される可変値)
});

// good
jQuery.each([1, 2, 3], function (i, value) {
console.log(value); // 常に Number 型 (Function#bind で変更されない固定値)
});

繰り返し処理をする上で要素の値は固定値でなければならないので this 値を指定すべきではない

84 :デフォルトの名無しさん:2016/04/26(火) 00:50:01.95 ID:6NLvX0gR.net
>>80
> jQueryは要素ごとの情報の格納場所の必要性を昔から認識していた
これは俺もすごく思うが、
実際のところはリークと速度低下が怖くてJavaScript側で持っている。
さすが実用ライブラリだけあって痒い所には手が届いているというところか。

>>82
> handleEventはswitchでイベントを振り分ける必要があって使いづらい。
これは何故?俺は使ったことは無いが、見る限りそういう感じではない。
イベントハンドラは基本的に直リンクというか、振り分け済みの関数を与えるのが基本で、
thisが効くオブジェクトを与えられるのなら、子クラスを与えればいいだけ。
当たり前だがオブジェクト指向の基本どおりだ。
また、最初からイベントハンドラ内で振り分けする気であれば、
ルートNodeにイベントつけてe.targetのclassで判定するのが自然だ。
何か別の条件ではまっただけの気がするが。

とはいえ、DOMの仕様がJavaScriptから見て中途半端なのはJavaとの相乗りが原因だとは理解した。

85 :76:2016/04/26(火) 00:51:40.14 ID:74Un+zc0.net
>>83の続き

// bad
function fn1 (event) {
this.classList.add('hoge');
}

// good
function fn2 (event) {
event.currentTarget.classList.add('hoge');
}

element.addEventListener('click', fn1); // OK
element.addEventListener('click', fn2); // OK
element.addEventListener('click', {handleEvent: fn1}); // NG
element.addEventListener('click', {handleEvent: fn2}); // OK

handleEventを拡張した場合、this値を指定したコードは動作しなくなる
ようするに、this は可変値なので固定値をとりたい場合に使用するべきではないという事だ

---
this が可変値である事を上手く利用した例に Array.prototype.forEach がある

Array.prototype.forEach.call(document.querySelectorAll('.test'), function (element) {
element.classList.add('foo');
});

これが動作するのは Array.prototype.forEach が this 値が配列でなくとも動作するように設計されているからだ
this 値は変動するから Function#call や Function#bind が生きる
だからこそ、this 値が変動する事に価値を見出せる設計にする必要がある

86 :76:2016/04/26(火) 01:08:23.70 ID:74Un+zc0.net
>>80
jQuery でも event.currentTarget で書くことは出来るが、ドキュメントのサンプルコードを読む限りでは作者が this を推奨しているように読める
「許さない」は言いすぎだったかもしれないが、this を推奨するという事は this 値が変更される事を考慮していないのではないか
this 値は実行コンテキストに入る時点で決まる不定値であり、this === event.currentTarget になる保証はない
https://api.jquery.com/on/

余談だが、jQuery#each と Array#forEach でコールバック関数の引数順序が違うのは this 束縛がある影響だと考えている
jQuery では this で各要素ノードを参照できるので第1引数に element を持っていくと index を参照する為には第2引数まで書かなくてはならない
forEach の設計としては直感的ではないが、ショートコーディングの為に index を第1引数に持ってくる歪な修正を加えたようにしか見えない
https://api.jquery.com/each/

jQuery('.hoge').each(function (i, element) { console.log(this, i, element); });

87 :76:2016/04/26(火) 01:50:16.54 ID:74Un+zc0.net
>>80
> 事実はあんたが思っているのと正反対だよ。
jQuery#data は優れた機能(ただし、data独自属性の拡張はいただけない)だし、jQuery() のセレクタエンジンは素晴らしいものだった
JSON, querySelector 等、優れたライブラリ/先行実装が標準仕様に取り込まれるのはよくある事だ
jQuery の全てを否定したいわけではなく、「jQuery の this の使い方が好ましくない」と主張している

> そう言う用途として使うのは、DOM要素のdatasetだよ。
dataset は String 型しか格納できない為、jQuery#data の代替にはならない
jQuery#data の代替として期待されたのは DOMUserData だが、この API は残念ながら廃止された
https://www.w3.org/TR/2004/PR-DOM-Level-3-Core-20040205/core.html#DOMUserData
今では機能的に逆だが、WeakMap が代替となりうるだろう
http://www.ecma-international.org/ecma-262/6.0/#sec-weakmap-iterable

88 :デフォルトの名無しさん:2016/04/26(火) 11:16:02.05 ID:x636ghAj.net
つうか結局何が言いたいの?
thisはpythonのselfみたいに一定の規則はあるが
あくまで0番目の引数みたいなもんで何に使おうが勝手だし
そういうのを利用するならきちんと把握しないといけない
その程度のことに良いとか悪いとかはない
使いたいならただ受け入れればいいだけ

なんかよく分からんけど気持ち悪いみたいな
結局愚痴をダラダラと言いたいだけならもうここら辺でやめとけ

89 :デフォルトの名無しさん:2016/04/26(火) 17:56:08.45 ID:LGdk9fYg.net
C#みたいにobj.Methodでバインドしてくれれば楽で綺麗に書けるのにね
いちいちbindって書くの面倒

90 :デフォルトの名無しさん:2016/04/26(火) 19:15:29.79 ID:v8OmTco7.net
>>88
ここまで説明されて愚痴にしか読めないのなら口を出さなければ良いと思うけど

91 :デフォルトの名無しさん:2016/04/26(火) 19:52:24.85 ID:PAn5oHiy.net
>>89
引数としてメソッドを渡す際は今だと
obj.method.bind(obj)
よりもアロー関数を使って
()=>obj.method()
の方が良いかもしれない

あとバインド基本にするのは結構簡単
クラスのプロトタイプにそういうプロキシを挟めばいい
アノテーションとか使えるようになればなお綺麗に書けるね
まあバインドシンタックスobj::methodとかもあるんだけどね

そういうのを使えるトランスパイラ使うってのも悪くないと思う

92 :デフォルトの名無しさん:2016/04/26(火) 23:52:32.19 ID:6NLvX0gR.net
>>83
前半、言っていることは分かるんだが、現実的には、
this がDOMであるコードと自前のオブジェクトを this 参照するコードを
同一のコードで処理(相互運用)するためには、
自前のオブジェクトをDOMモドキにする必要があって、
(DOMと同じプロパティ等でアクセスできるように形を揃える)
これだと余計に苦労する。
だから結局、既に書かれたコードを流用することは難しく、
書き直すかラップしてしまうほうが簡単だ。
多分現実的には相互運用をしている奴は少ないのではないかと思う。
もちろんthisで共通アクセスできないとその可能性すらないからそれよりはマシだが、
現実的にはこの仕様はあっても使えない。

93 :デフォルトの名無しさん:2016/04/26(火) 23:53:03.95 ID:6NLvX0gR.net
>>82の話の通りなら、handleEventはJava用であって、JavaScript用ではないことになる。
実際、>>85ではメリットが無いだろ。
JavaScriptでわざわざ使うのならメリットがある以下の記述になる。

var hit_list = new Set();
var EventHalndler = function(){
this.status = 'waiting';
}
EventHandler.prototype = {
handleEvent: function (e) {
e.currentTarget.classList.add('hoge'); // class で管理
this.status = 'hit'; // 個別オブジェクトで管理
hit_list.add(e.currentTarget); // Set で管理
}
};
var ehandler = new EventHander();
element.addEventListener('click', ehandler);

DOM側で管理するならclass、JavaScript側で一括管理でよければSetでいい。
どうしても個別のオブジェクトに格納したければ 「thisを生かして」 使うことになる。
当たり判定のグルーピングを細かく変更したいときはこのやり方が適するけど、
用途はあまり無いと思う。

94 :デフォルトの名無しさん:2016/04/26(火) 23:54:04.46 ID:6NLvX0gR.net
だから「相互運用」を考えるのなら、
e.currentTargetとthisの両方を異なる意味で用いている上記のようなケースをどうするかであって、
多分これはどうにもならんだろ。
手っ取り早いのはラップ関数内でthis値をMapなりから引っ張ってきてしまうことだが、
要するに書き換えが必要なので仕様をわざわざ合わせた意味がない。
何らかのために仕様をあわせたというのなら、
そのおかげで書き換えなくても済みました!がないと意味が無い。

DOM側からすると妥協だということだが、放置でもよかった気はする。(仕様として追認の必要なし)
なお、thisかe.currentTargetの片方しか使ってないコードは自動でも書き換えできる範囲だと思う。

しかしそうなると問題の出所はブラウザの実装で、
何故e.currentTargetに統一せずにthisを渡すことにしたかだな。
正直、あれ、thisで渡されても全くメリットないよな?

> DOM4で標準化された事で既存のコードが確実に動作する事が保証された
これは多分、気にする人にとっては重要なのだろうけど、
Webサイトなんて10年後の動作を保証されたところで意味が無いし、
「当面(数年)確実に動く」であれば大半の人にとって問題ない。
それが実装主体で推移している原因にもなっていると思う。

95 :デフォルトの名無しさん:2016/04/26(火) 23:55:02.00 ID:6NLvX0gR.net
>>82
とここまで書いて気づいたが、switch は e.target ではなく e.type か。
確かにこれでは使いにくいな。JavaScriptなら以下で逃げられるが、
これが出来ないからオブジェクトで与えているのだと思われ、Javaでは壮絶な糞コードになりそうだな。

EventHandler.prototype = {
handleEvent: function (e) {
this[e.type].call(this,e);
},
click: function(e){},
mouseover: function(e){},
mouseout: function(e){},
};

96 :デフォルトの名無しさん:2016/04/26(火) 23:55:42.51 ID:6NLvX0gR.net
>>86
いやそのjQuery.eachのthisは意味があるぞ。
それならthisで書かれたイベントハンドラをeachで回せる。(DOMのイベント寄り)
ただe.currentTargetで書くべきだというのと、
そもそも他に代替手段がありまくるので、割とどうでもいいが。
thisを固定したことによるデメリットの方が上回るかもしれない。

ただまあ、そちらの主張どおり、
thisに対しては緩く考える(○○が来ると仮定しない)方が何かと便利なのは事実だろう。

97 :デフォルトの名無しさん:2016/04/27(水) 00:28:53.55 ID:mjPz9hpH.net
「thisは基本レシーバ」
それ以上でも以下でもない

98 :デフォルトの名無しさん:2016/05/01(日) 14:45:40.12 ID:tKi6j9CT.net
匿名通信(Tor、i2p等)ができるファイル共有ソフトBitComet(ビットコメット)みたいな、
BitTorrentがオープンソースで開発されています

言語は何でも大丈夫だそうなので、P2P書きたい!って人居ませんか?

Covenantの作者(Lyrise)がそういう人と話したいそうなので、よろしければツイートお願いします
https://twitter.com/Lyrise_al

ちなみにオイラはCovenantの完成が待ち遠しいプログラミングできないアスペルガーw


The Covenant Project
概要

Covenantは、純粋P2Pのファイル共有ソフトです

目的

インターネットにおける権力による抑圧を排除することが最終的な目標です。 そのためにCovenantでは、中央に依存しない、高効率で検索能力の高いファイル共有の機能をユーザーに提供します

特徴

Covenant = Bittorrent + Abstract Network + DHT + (Search = WoT + PoW)

接続は抽象化されているので、I2P, Tor, TCP, Proxy, その他を利用可能です
DHTにはKademlia + コネクションプールを使用します
UPnPによってポートを解放することができますが、Port0でも利用可能です(接続数は少なくなります)
検索リクエスト、アップロード、ダウンロードなどのすべての通信はDHT的に分散され、特定のサーバーに依存しません


99 :デフォルトの名無しさん:2016/05/03(火) 12:04:12.37 ID:YtCRz7OH.net
もうWebRTC利用したJS製のそういうフレームワーク何個も作られてるよ

100 :デフォルトの名無しさん:2016/05/03(火) 18:27:13.57 ID:Hru3QNWj.net
WebRTCって要するにP2Pチャットサーバ用だよな。
元々それ用だけどそれ以外に用途が無い。
もちろん発展させればWinnyやskypeみたいな事は出来るけど、それなら最初からそっちでいいし。

俺も最初知ったときは「ウッヒョー」だったけど、冷静に考えたら落ち着いた。
現実的には大半の事案は鯖立すればいいだけだからね。
技術的には面白いとは思うけど。

101 :デフォルトの名無しさん:2016/05/04(水) 19:58:18.58 ID:znxAfP3/.net
ちいと勘違いしてるが、WebRTCに鯖とのやり取りもといマッチングの仕組みは含まれていない。
WebRTCでそれをするのはちょっとハックっぽくなるが、
特にORTCなら鯖レスの固定相手P2Pも素直にできる。

現在は
・ビデオ/ボイスチャット
・MMOゲーム
・一方向型のファイル共有
によく使われてる

102 :デフォルトの名無しさん:2016/05/04(水) 23:45:02.80 ID:umoiWZhY.net
> MMOゲーム
これにはいいかもな。

それ以外は正直、「ブラウザでできる」以上の意味は無いよね。
最初からP2Pする気ならP2Pアプリを使った方がいろいろいいし。
一方向型のファイル共有ってそれただの鯖じゃん。

103 :デフォルトの名無しさん:2016/05/05(木) 04:30:39.98 ID:2KiZjc5Z.net
ブラウザでできるからこそ特大の意味があるんだよ
今著名なWebサービスはアプリも出してることが多いけど、
じゃあ皆がそっちの方を使ってWeb版はいっさい要らなくなるかというとそうではない
一時期そういう流れも起きたがやはり無理だったということで、今は流れが戻っている(Flipkartが良い例)
わざわざアプリをインストールして管理しないといけない手間が要らないのはとてつもない利点だよ

そして、ファイル共有に関しては鯖レスで実現できるところがメリット
鯖を挟むと帯域を本来の2倍取り、さらに負荷が鯖に集中してしまう
宛先の絞られているファイル等はP2Pで送る形のほうが良い

104 :デフォルトの名無しさん:2016/05/05(木) 09:25:46.88 ID:fknk/t2B.net
ブラウザのBBOM化はもう勘弁して

105 :デフォルトの名無しさん:2016/05/09(月) 15:41:03.36 ID:iKr5Nm9H.net
なんで?

106 :デフォルトの名無しさん:2016/05/09(月) 22:54:55.21 ID:Ji3tRhpw.net
BOMのことだよな?
個人的にはDOMやBOMでAPIアクセスできるのはお手軽でいいと思うぞ。

107 :デフォルトの名無しさん:2016/05/09(月) 23:34:30.27 ID:fQwtjbTF.net
もはや種類多すぎる上に増加スピードが速すぎて把握するのがしんどいわ
でも無ければ無いで何も作れないしな

108 :デフォルトの名無しさん:2016/05/10(火) 10:34:10.82 ID:AYSgFkex.net
スピードが早いというが、一年くらい前から高レベル系のAPIが熟成期に入って停滞してると思う
また来年くらいから今度は低レベル系のAPIが動き始めるんじゃないかな

109 :デフォルトの名無しさん:2016/05/10(火) 23:06:42.46 ID:vhPcYSkB.net
> 低レベル系のAPI
上の話ともリンクするが、ブラウザはお手軽さが最も重要なのであって、
ゴリゴリ書いて性能を出すのには不向きだし、流行らないと思うぞ。
結局のところ、専用ネイティブアプリには実行効率では勝てないのだから、必要なら開発される。
そこまでの必要/需要が無ければブラウザアプリのままでいけることになる。

ただ一つ思うのは、CPUとI/Oを分離し、非同期で書くことを強制するのは、実はかなり効いている。
体感、思っているよりだいぶ速いんだよね。
他言語だと普通に同期で書くし、描画でもそのまま記述する。(分離して書く習慣が無い)
これら遅い部分を明示的に分離し記述することが半強制されている結果、
結果的にCPU稼働率の高い「割と速い」コードが出来上がることとなっている。

だからちゃんと書いたJavaScriptは十分速いし、
それ以上の速度を要求するのならC/C++で書き直すしかない。(V8がC比5倍程度と十分速い為)
どんなJavaScriptでも最後にトランスパイルすれば速くなるというのなら、それはJIT側に含まれるべきだし、
何らかの記述制限をつけて「ちょっと速いJavaScript」を目指すものは、多分需要が無い。
(本来そこにはC比3倍程度というJavaアプレットがいたはずだが、完全に死んでるし)

110 :デフォルトの名無しさん:2016/05/11(水) 07:45:48.20 ID:XhqmdNgU.net
>>109
考え方が全く違う。低レベルAPIは、高レベルAPIを作るために必要なの。
高レベルAPIを標準仕様として策定してたら互換性などを強く考慮する必要があり、
メジャーブラウザが一通り実装して使えるようになるまで極めて時間が掛かる。

そしてその時に本当に必要とされるものに出来なかったという失敗も数多くしてきた。
実装にも時間が掛かるが、古いAPIを削除するにはそれ以上の時間がかかってしまう。

でも低レベルAPIを提供するようにすれば、ライブラリやポリフィル程度の気軽さと速度で
その時代に必要とされる高レベルAPIが作られていくようになるし、
そこで持て囃されデファクトを築いた仕様を改めて標準に持って来ればいい。

ポリフィルだらけになるということさえなんとかすれば、他の様々な問題が解決される。
それが低レベルAPIの道入。「Extensible Web Manifesto」だよ。

>>109
また、何をもってちゃんと書くと言っているのかわからない。
結局スクリプト言語であるJSの大部分のコストかかる場所は大抵DOMなんかの外部APIを叩いた部分だからね。
でもそうでないゲーム思考エンジンなどを作ったりするけど、「ちゃんと書けば」
単純演算系ロジックのパフォーマンスが1/5倍なんて最悪の見積もりだよ。
1/5くらいのケースもあるけど、10%程度しか分からないケースもあり、アベレージで大体1/2位になる。

まだSIMDやらパラレルやらの最適化が完了してないのでそこが大きく絡むともう1/2くらいにはなるが、
1/5は最悪中の最悪ケース。

111 :デフォルトの名無しさん:2016/05/11(水) 22:18:37.29 ID:ye4EAN+q.net
APIはポリフィルできても、言語はポリフィルできないからな。
だからBabelなどのトランスパイラが必要になる。

112 :デフォルトの名無しさん:2016/05/12(木) 00:54:26.89 ID:TctSTaTq.net
>>110
> Extensible Web Manifesto
以下を読んだ。
http://jxck.hatenablog.com/entry/extendthewebforward
言っていることは分かるが多分無理だな。

低レベルAPIのすり合わせは高レベルAPIよりも難しい。
だから高レベルAPIのすりあわせすらマトモにできなかった連中には無理だ。

> そもそも、デバッギングはコーディングよりも2倍難しい。
> 従って、あなたが可能な限り賢くコードを書くとしたら、定義からして、あなたはそれをデバッグできるほど賢くない。
> ブライアン・カーニハン [Brian Wilson Kernighan]

高レベルAPIの仕様策定が失敗しているケースが多々ある点についてはよくは知らないが、
JavaScript言語自体の仕様を見る限り、いろいろ迷走している点は多い。

仕様策定が失敗するのは、単純に使用策定している奴らに先見の明が無いからだ。
だから逆に言えば、先見の明が無いような奴らが仕様策定に関わってはいけない。
JavaScriptの連中はそこらへんを勘違いしている。だからゴミ仕様が山積みになる。
AppCacheがゴミであろうと、仕様として策定された以上、実装しないわけには行かない。
だから結局、ブラウザに対してゴミコードを含まなければならないという足かせが出来ただけになる。
結果的にJavaScriptの世界はゴミが増えていき、ゴミに振り回されることになる。
これを理解できていない。

とはいえ、それでも進化の速度を取っているといえばその通りだ。
C#が伽藍型仕様開発なら、JavaScriptはバザール型という訳だが、目に付く失敗も多い。
もちろん、XHR等は大成功の一例なのだろう。どちらが多いのかは、俺にはわからない。
SeviceWorkerがどうなるのかは見ものだな。

113 :デフォルトの名無しさん:2016/05/12(木) 00:54:55.63 ID:TctSTaTq.net
> ちゃんと書く
速度を問題にしているのだろう?だったらきちんと速度が出る書き方をするということだよ。
5倍というのはググれば出てくるはずだがN-body、つまり演算部分だ。
同様のベンチは他の人もやっていて、大体同じような値になっている。

ただ指摘の通り、その部分は他のもっと遅い部分に隠蔽され、結果的に見えないことが多い。
(ただしだからといって遅い部分も含めて速度比較して大差ないとか言う屁理屈はうざいだけだから止めろ。
それは速度比較とは言わない)
だからJavaScriptが通常用いられる用途に関しては、JavaScriptは十分速いし、
それ以上を望むのなら、ゴリゴリ書くしかない。

> ゲーム思考エンジン
これは環境はなんだ?
個人的には主力テキスト操作スクリプトをAWK/Perl->JavaScriptに乗り換えようかと思っているんだが、
DOS窓から操作できる使いやすい環境ってないか?
AWKやPerl同様、一行ずつ標準入力からReadline出来ればそれでいい。
nodeが一番マシか?

114 :デフォルトの名無しさん:2016/05/12(木) 05:43:37.43 ID:s4pSKHj7.net
WSHが一番マシ

115 :デフォルトの名無しさん:2016/05/12(木) 08:43:22.73 ID:pPHDojvh.net
>>112
無理では無いと思う。
基本的にセキュリティや機能制限の面が一番難しいだけで、
そこさえクリアできれば、低レベルAPIの仕様自体は一意に決まりやすいものだから。
まあ高レベルAPIと同じくらいの難しさだろう。

そして求めてるのを作れなかったというのは、
策定に時間がかかったり、実装者や開発者とのやり取りが十分ではなかったから。
先見の明が無いと言えばそうかもしれないが、
今まで無かった様々な機能が必要とされる中でいきなり完璧を目指すのは無理というものだ。
そして今でさえ策定が遅いのにこれ以上慎重になるわけにもいかないのだよ。

それを反省し、よりフットワークの軽いだろうライブラリ界に高レベルAPIを練る役目を託し、
フィールドバックを十分にした上で標準仕様として改めて定義し直そうというのがEWM。
これにより発展速度も安定性も上がると思っている。

>>113
自分が言った「ちゃんと書く」とは、asm.jsを(部分的に)手書きするということだ。
例えばこの記事の時点ではN-bodyもasm.jsならネイティブの約1/2(今はもう少し速くなってる)
自分の考えるこういう時のネイティブってのイメージはLLVM+Clangなんだが、
いずれにしろ記事見ても分かるように、syscallsが絡んだりするとasm.jsの方がパッと出早い場合も有るくらいなのだ。

まあ手書きしやすいように手書きするとやはり静的言語からコンパイルするよりは落ちることが多いが、
それでもアベレージで1/2のイメージで良いと思う。
自分はNodeを使ってる。V8はC++モジュールとの連携が楽なので、JSがどうしても苦手な部分はC++で書いたりもしやすい。

116 :デフォルトの名無しさん:2016/05/12(木) 08:44:46.17 ID:pPHDojvh.net
記事リンクを貼ってなかった
https://blog.mozilla.org/javascript/2013/08/01/staring-at-the-sun-dalvik-vs-spidermonkey/

117 :デフォルトの名無しさん:2016/05/12(木) 23:52:09.31 ID:TctSTaTq.net
>>114
WSHか。あれ食わず嫌いだったけど、やっぱお手軽でよさそうだよな。
まあやってみることにするよ。

118 :デフォルトの名無しさん:2016/05/12(木) 23:59:02.52 ID:TctSTaTq.net
>>115
違う。
> 策定に時間がかかったり、実装者や開発者とのやり取りが十分ではなかったから。
仕様策定とは「常に」こういうものなんだよ。言語のみならず他でも全て。
有名なイラスト、見たことがあるだろ。
> ニコニコ大百科/a/顧客が本当に必要だったもの (リンクはRock54で貼れない)
だから、これを分かった上で、そうならないようにする「実力」が必要なんだよ。

具体的に言えば、どんなに時間がかかろうが、いい仕様(必要な物)ならみんな使う。
だから、時間をかけてでもいい仕様にするというのが「先見の明」作戦。
これが無理なら、古典的だが報告連絡相談(ホウレンソウ)をきっちりやるしかない。
出来なかったのなら、どちらの作戦もやりきる実力が無かっただけ。

試行錯誤で進めていくのもありだと思うけど、
それなら結果的に無意味になってしまった仕様等をばっさり捨てていく覚悟も必要。
(詳しくは知らないがRailsはこれに近いのかもしれないし、それも妥当な戦術)
後方互換も必要です、新しい仕様も必要です、
でも十分な仕様策定能力はありません、というのが今のJavaScriptの状態だね。
進化速度を捨てるわけには行かないのだから、後方互換を捨てるしかないと思うのだけどね。
この点で言えば、ポリフィルでお茶を濁しまくっているのはいい作戦ではある。

とはいえ、出来る/出来ないをここで議論する意味は無い。
結果を見ればいいだけだから。

119 :デフォルトの名無しさん:2016/05/13(金) 00:04:56.39 ID:PxVJ9U+u.net
>>115
> 自分が言った「ちゃんと書く」とは、asm.jsを(部分的に)手書きするということだ。
だからそれは屁理屈なんだよ。
言語の速度比較なら、普通に書いた、つまりそこらへんに転がっている記述同士でやらないと意味無いだろ。
Cでインラインアセンブラを使うのは無し、
JavaScriptなら普通に [], {}を使って書いたものだよ。全面 TypedArray とかは無しだよ。
というか、それならそもそもそういう言語で書けって言われるようじゃ駄目だろ。
言語の比較なら、それぞれの言語の良さを生かした状態で記述してあるものでないと。

君が言っているのは、「チューニングしたときに伸びしろがあるか」ということであって、
言語の速度比較ではないんだよ。
CならSSEやCUDAまで導入できるのだから、それも入れていいかというと違うだろ。
普通に書いて普通にコンパイルできる状態での比較じゃないと意味無いだろ。

そして、そこでいちいちムキになることも無いんだよ。
不満があれば他言語で書けばいいだけ、
その言語を使っているのなら、エコシステム含めてその言語が一番マシだから使っているだけ。
それ以上でもそれ以下でもないだろ。

120 :デフォルトの名無しさん:2016/05/13(金) 09:43:39.39 ID:1hqv3t07.net
>>118
JavaScriptと言うより、Webの宿命。ES仕様自体は元々が小さかったのも有り、
妥当で慎重な機能追加で順調に進化してきている。

そして今まで悪かったからこそそれを改善しようと言うのがEWMなのに、
なにを否定したいのかがわからん。
EWMならダメな仕様等をばっさり捨てていくことも可能。
というか結果的に皆が使い良いと認められる仕様だけが標準になるのだから。
更には公開と発展の速度まで引き上げられる。

そしてasm.jsを手書きすることが屁理屈だなんてとんでもない。
勿論emscriptenが書き出すようなのを手書きするのは変態だが、
どうせちょっと高速化を意識するとTypedArrayをメモリに見立ててあれこれするようになる。
それはasm.jsがやってることと同じなので、asm.jsパターンにちょっと直せばいいだけ。
ただのお作法みたいなものでしかなく、そっちこそ何をムキになってるんだか分からん。

別に素のJSがC++と比べてどれだけ早いなんて自慢話をしたいわけじゃないし興味はない。
JSで事実速いコードもそこそこ書くことが出来、その結果現実的に実現できることがあるということが自分にとって重要

もちろんこういうことをするのはレアケース。
だって先にも言ったようにそこら辺に転がっている実用コードの殆どのボトルネックが外部APIだし、
よくあるマイクロベンチみたいなのを意識しても仕方ないから。

一方それ以外の素の速度が重要なケースでは、どんな言語で書いてもそれなりにアルゴリズムやチューンを気にするだろうし、
asm.jsに沿って書く程度十分あり得る範囲だよ。

121 :デフォルトの名無しさん:2016/05/13(金) 17:53:59.39 ID:1hqv3t07.net
Railsとかサーバサイド言語/環境と違って
WEBは1つの実装で色んな時代に作られたデータを読まないといけないのだし
仕様の量も段違いで数十か数百かのモジュールが組み合わさって成り立っているのだから
その1つ1つのバージョンを意識したり指定したりということはできないし
原則後方互換性を守りながら拡張していくしか無い

WEBがもっとシンプルで昔のようにほぼW3Cが牛耳っていれば問題はなかったのだが
世間や環境がそうさせてくれなかった
WEBはマグロのように泳ぎ続けるしかない定め

122 :デフォルトの名無しさん:2016/05/13(金) 20:51:55.08 ID:PxVJ9U+u.net
>>114
> Microsoft Windows 98、Windows 2000、および Windows Me には、
> Microsoft JScript および VBScript の 2 つのスクリプト エンジンが用意されており、
> 通常はこのいずれかを使用してスクリプトを記述します。
> Windows Script Host では、このほか、Perl、REXX、Python などのスクリプト エンジンも使用できます。
> https://msdn.microsoft.com/ja-jp/library/cc392505.aspx
やべーわ完全に食わず嫌いだったわ。
見た目、.NETと同じく言語非依存のフレームワークを提供しているんだな。
標準入出力+αで満足するから完全に十分だわ。
というか結果的にMSには先見の明があったな。

以下によると//xでデバッガが起動出来るらしいが接続してくれない。
そっちでは動いている?
> WSHはVisual Studioでデバッグを行うことが可能です。
> Visual StudioはExpressの場合にデバッグが行えないかもしれません。Professional以降が必要かもしれません。
> http://qiita.com/mima_ita/items/127e171db67aaee6ef30
Vista+VSExpressなんだけどね。

123 :デフォルトの名無しさん:2016/05/13(金) 20:58:41.47 ID:JdHqQx2Q.net
外部と隔離された無人島で20年過ごしてきた人なのかな?

124 :デフォルトの名無しさん:2016/05/13(金) 22:06:05.08 ID:PxVJ9U+u.net
>>120
> EWM
否定したいわけではないが、君が言っているような「打ち出の小槌」なんてどこにもないんだよ。

低レベルAPIを規定して高レベルAPIを柔軟に構築というのは確かに出来る。
ただ、その高レベルAPIを「仕様として」リリースしたら、一般的にはもう削除は出来ないんだよ。
だから不要になった場合は、エミュレーションモードとして、動きはするがそれだけのもの(速くはない)として残すことになる。
VGAとかがまさにそう。今時のグラボもVGAは表示できないといけないので、この方法で残している。

ただエミュをするのなら、低レベルAPIによってではなく、実装側で高レベルAPIだけをエミュしたほうが簡単なんだよ。
それを低レベルAPIでエミュしろ、そうじゃないと駄目だ、ということになると、性能が引き出しづらくなる。
だから結局、低レベルAPIで高レベルAPIを構築というのは効率が悪くなる。多分頓挫する。
そのやり方はAPIではなく、ライブラリの粒度でやるべきなんだよ。
ライブラリってのは標準JavaScriptを低レベルAPIとして、中レベルAPIを構築しているわけだから。

例えばAppCache、もういらないとして、ブラウザ側で高レベルAPIだけをエミュするだけならまあ簡単だろう。
他の似た機能があれば、それと中身は差し替えて見た目だけエミュすることも可能だ。
(WebSQL->IndexedDBの場合とか)
しかしそれを構築するために使用した低レベルAPI群があるとして、これらも不要になるわけだが、
それらを全部エミュしたままで残せということになると、結局手がつけられず、そのまま残すしかなくなる。
結果、ブラウザ側に「開かずの扉」的コードが累積していき、長期的に進化を妨げることになる。
こうならないためには、「将来的にも」不要にならないAPIだけを規定していくことが肝要。
これは低レベルAPIの方が難しいんだよ。

125 :デフォルトの名無しさん:2016/05/13(金) 22:06:20.89 ID:PxVJ9U+u.net
まあいずれにしても、上手く行くかどうかは結果を見ればいい。
俺は上手く行かないと予想している。
ブラウザ側も馬鹿ではないから、俺が言っていることぐらい分かっている。
だからgoogleの「最適化としては行うが、asm.jsにべったりでは無い」というのがかなり妥当。
旗振り側のFireFoxは実装するしかないから、両方の言い分は分かる。
君の見方だけではgoogleが及び腰な理由を説明できないだろ。

126 :デフォルトの名無しさん:2016/05/13(金) 22:12:02.90 ID:PxVJ9U+u.net
> どうせちょっと高速化を意識するとTypedArrayをメモリに見立ててあれこれするようになる。
それはCの考え方だ。そして君はC/C++と連携するためにNodeを使っているのだから、君としてはそれで正しい。
ただ、「メモリ」を意識するのはJavaScriptじゃないんだよ。
だから、君はおそらくCの考え方に束縛されている。

というか、それだと君はJavaScriptを使えていない。
君だと、Rubyでは何故ただの数値ですらオブジェクトなのか説明できないだろ?

例えばサーバーのログを解析するとして、grepで済むならそれでいいけど、
それ以上なら通常はPerl等が用いられる。
もちろんこれをCでやることは出来るけど、普通はやらない。
理由は簡単、Perlの方が楽だからだ。
それをどうしてもCでやれ、Perlはインストールしてねーとなると、ふざけるな!となるだろ。

JavaScriptも同じで、クライアントスクリプトという政治的要因が無ければ、
当たり前だがその言語を使うのが一番楽(適している)ところで使われる。
その状態においては、
> どうせちょっと高速化を意識するとTypedArrayをメモリに見立ててあれこれするようになる。
これが要求されることはほぼ無い。
というか、メモリアクセス速度が要求されるのなら、最初からC/C++で書け、でしかない。
実際にこれで高速化するのなら、本来Cで書けばいいだけのものをJavaScriptで書いてるだけだよ。 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)


127 :デフォルトの名無しさん:2016/05/13(金) 22:12:42.95 ID:PxVJ9U+u.net
PerlやRubyと同様、JavaScriptにもいい点はあって、
それを生かす書き方をしていると、仮にCがブラウザで動いたとしても、Cじゃつれーわ、となる。
君にはそれが無いだろ?それはJavaScriptを使っているだけで、使えていない。

クライアントスクリプトでの高速化は、今の俺の結論としては「後回し」、これに尽きる。
1画面分しかDOM操作はしない。出来れば内部データも用意しない。
これだけで見た目はものすごく速くなる。

クライアントサイドでどうしても演算が必要な場合は、ゲームか非標準の強力な暗号化くらいだよ。
速度が重要なガチゲーやる奴は「サクサク専用アプリ」があれば必ずインストールする。
だから結局用途が無いんだよ。

速いことは重要なのだけど、JavaScriptに求められているのは演算やメモリアクセス速度ではない。
演算が10倍速になるより、DOM操作が2倍速になる方が効く。
asm.js っぽくコーディングするよりも、DOM操作を1つでも減らすようにした方が効く。
だから asm.js は悪くは無いけど、いい筋ではないんだよ。
そして一般のクライアントスクリプトで asm.js 流の書き方をすることも無いよ。
だって読みにくくなるだけで効果ないから。つまり、流行る理由が見当たらない。

君はasm.jsがブラウザに必要とされていると本当に思っているのかい?
asm.jsが実装されるより、ブラウザでのDOM操作速度が2倍になる方が普通はうれしいだろ。

128 :デフォルトの名無しさん:2016/05/13(金) 22:40:16.76 ID:PxVJ9U+u.net
>>121
> 仕様の量も段違い
とにかくこういうことにしたい奴が多いようだが、これは明らかに違う。
.NETにしてもJavaにしてもクラスライブラリの量は桁違いに多い。
文法的にも覚えることは多いし、記述的にもより細かく指定できる。
JavaScriptは軽くて簡単な言語だよ。元々そう作られたものだし。
(これは悪いことではない)

> その1つ1つのバージョンを意識したり指定したりということはできないし
> 原則後方互換性を守りながら拡張していくしか無い
Javaは知らんが.NETはバージョン管理されていて、
廃止されたメソッド等もある。(完全上位互換ではない)
ちゃんとやれば出来ることなんだよ。もちろんその実力が必要だけど。

詳しくは知らないが、DirectXはバージョンが一つ違ったら別物だったらしい。
低レベルAPIだから必然的に実装とリンクしてしまうのでこうなる。
結果的にMSはDirectXを使い捨てし続けることで乗り切っている。
Webもやれば出来るだけだよ。やってないだけ、やる実力も無いだけで。

とはいえ、試行錯誤でいくというのも一つのいい作戦だ。
その場合は、どうしてもゴミが紛れ込んでしまうので、定期的にGCしないといけない。
それが全く出来てないからおかしなことになっている。

129 :デフォルトの名無しさん:2016/05/14(土) 00:17:31.72 ID:8701OXOx.net
> 詳しくは知らないが、DirectXはバージョンが一つ違ったら別物だったらしい。
DirectXだけじゃなくて「昔は」って言ったほうがいいよ。

MSにかぎらず開発初期は変化が激しいのが普通だから
バージョンが一つ違っただけでも大幅に違いがある。

だけど、MSもそうだけど、成熟してくるとそう変わらない。
DirectXも同じ。

130 :デフォルトの名無しさん:2016/05/14(土) 05:05:12.84 ID:lm5IbmMb.net
>>124
だからその将来的にも不要にならないってのが低レベルなAPIであることは間違いないのだが。
例えばNodeはSocket APIがあったのでネイティブで対応する前からWebSocketやHTTP2にもすぐ対応できた。
低レベルってのは語弊があったかもしれないがこのSocket API程度のことをイメージして話してる。
CSSで言うと変数とかフローレベルの定義とか、その程度。
>>125
それは最初だけ。V8も去年から専用の最適化機構を入れている。
>>126
「Cの考え」とかはない。メモリに見立ててと言ったのが語弊が合ったかもしれないが、
盤面情報などを多重配列で構築する代わりに1つの型付配列に収める程度のアルゴリズムの問題。
データ配置を意識しないといけないが、実際幾つも変数やら配列データやらを用意するよりもシンプルになり、
パターンとしては別に他の選択肢と比べても奇抜ではなく、JSらしくないこともない。
>>127
実際asm.jsを使う場面が殆ど無いのは先も言ったとおり。
ただDOMがボトルネックの場面について(削減などに関する別の毛色の話は出来るだろうが)あれこれ言っても仕方がないし、
一方もちろんマイクロベンチ的なのを考えても仕方がない(本当はそうでもないこともあるが)と思っているので、
残った殆どないケースだがJSで書く必要があり、速度も必要な場面を基準に、「「ちゃんと」」書いた時の話をしたまで。
普通の場面で「「普通に」」書いた時の話はしてない。あくまでかなりニッチな話としてした。
>>128
Webは中央政権的でない(なくなった)から全てをひとまとめにしてバージョン付けはできない。
これは前提条件として話している。この前提がそもそも間違っているからと言う話題は
他のこれを前提の上どう良くしていくかの話題と分けてくれないとただの愚痴的批判でしかなくまともな話ができない。

131 :デフォルトの名無しさん:2016/05/14(土) 05:07:22.52 ID:lm5IbmMb.net
Webはそもそも誰のものでもなくオープンなものだ。これは前提以上のWebがWebであるための性質。
昔はいろいろなところがデファクトに沿いながらも自分達に都合のいい仕様を作った。
それじゃ困るからと言って標準化の動きがあって、ベンダーも自然淘汰され整理されてきたこともあり、ちょっとはまとまりがでてきた。
そこら辺で起こる、JSの高速化、スマホ等による環境の変化、中央政権的なFlash等プラグインの死。
よって今まで文章を表示するためでしか無かったWebを、アプリケーションの基盤となれるようにしようという需要・必要性が生まれた。
でもCSSの向上からBluetooth機能までありとあらゆることを一箇所で1つの仕様として定義するのは何十年かかるか分からない。
Flashのような中央政権的やり方はマズイという意識も合り、バージョニングの弊害の反省もあったので、
バージョンはむしろ廃止し、よりオープンなそれこそ誰でもGithubに書いて主張できるような仕様形態に「自然となっていった」。
さて、仕様策定のプロセスが大きく変わってきたが、(昔的な)標準機構(形・影は薄れてきてる)はこれから何をするのがよいのか。
じゃあもう低レベルなAPI群を定義して、もっとオープンに仕様を発展できるようにしよう。
というのがこれまでの歴史。
それを踏まえた上で分けて話して欲しい。

132 :デフォルトの名無しさん:2016/05/14(土) 08:40:44.17 ID:/oE1tyua.net
横から見てる者だけと、今のところはID:PxVJ9U+uの説明がしっくりくる感じ
ID:lm5IbmMb は表現が抽象的すぎてわかりづらい
「「ちゃんと」」(何をどうちゃんと?)
「「普通に」」(普通って何?)
「自然となっていった」(どの辺りが自然?)
何となくわかる気はするけど、具体的でない部分が誤解を生みやすいと思う
「ちゃんと === 速度を最上位に最適化した普通はやらないようなニッチな最適化」
こんな感じだと勝手に認識してるけど、一般的な感覚で考えても「ちゃんと」とは言い難いような

133 :デフォルトの名無しさん:2016/05/14(土) 13:45:41.17 ID:Jg6FEyPA.net
>>130
レベルに関わらず、「将来的に必要」なAPIだけ規定できれば全く問題ないのだが、
それが難しいんだよ。
AppCacheにしても、WebSQLにしても、その当時は「それが必要」だと思っていたはずなんだよ。
WebSQLの方は政治的横槍で、AppCacheの方は担当者の実力不足でゴミ化したわけだが。

いずれにしても、「今」そう思っているものが「将来も」正しいとは限らないんだ。
君が言っているものは「もう既にあって」「今必要」なものだろう。(Socketは1983年製)
それを仕様化するのも重要な仕事だけど、それは凡人でも出来る。
本来仕様化しなければならないものは、「今無くて」「将来およびその後もずっと必要」なものなんだよ。

AppCacheは後者をやろうとして頓挫した。これは実力不足だ。
WebSQLの方は前者、つまり既にあるものをWeb用に焼きなおそうとした。これは凡人でも出来る。
ただし政治的要因で頓挫した。
NodeのSocketは、前者でしかない。20年以上実績のあるものの導入であって、凡人でも出来るものだよ。

Webがもたらした「先進的」仕様は、例えばHTMLとCSSの分離とかだよ。
(当時はレイアウトと文書を分離しないのが一般的だった)
これが効いてて、スマホでも見れる画面になっている。(対応しやすい)
一方、基本的にピクセル指定する従来アプリ(.NET)とかをスマホで見ると悲惨だと聞く。
だから.NETはUIの焼き直しを迫られている。

AppCacheについては実は俺も使おうかと検討したことがあるが、止めた。
理由は、俺が対象としているサイトはリバースプロキシが普及していて、
変にキャッシュするより読み直したほうがサクサクだからだ。(304が速攻返ってくる)
これが他のケースでも当てはまるとしたら、仮にAppCacheの仕様がいいものだったとしても、誰も使わない。
この場合の正解は、「AppCacheなんてじきにリバースプロキシが普及するから必要ありません」だ。
あるいは、「オフライン?ナローバンド?そんなものはありえない時代がすぐに来ますよ」だ。
これを当時言い切れるかどうかが「先見の明」ということになる。

134 :デフォルトの名無しさん:2016/05/14(土) 13:46:10.60 ID:Jg6FEyPA.net
> JSらしくないこともない
要するに自分の手持ちの選択肢の中で「JSでやるのが一番マシ」と思えるのならそれでよし、
そうでないのなら、それはJSを無理に使っているだけだよ。

> 実際asm.jsを使う場面が殆ど無いのは先も言ったとおり。
ブラウザを作っている奴らも暇じゃない。無限のリソースがあるわけでもない。
奴らにとって「重要」だと認識されない限りは歯車は回らない。
そして今のところ、あるいは近未来的にもそうはならないというのが俺の見方だ。

135 :デフォルトの名無しさん:2016/05/14(土) 13:46:57.24 ID:Jg6FEyPA.net
> Webは中央政権的でない(なくなった)から全てをひとまとめにしてバージョン付けはできない。
これはそちらの認識が間違っている。
そもそも、仕様を策定するのは「困るから」であって、「支配する」為ではない。
元々W3Cがその位置にいたのだが、官僚的だったのか、とにかく仕様の決定が遅すぎた。
だから無視するのが通例になってしまっているが、本来はW3Cが機能していればよかっただけの話だ。

ただ結果を見ている限り、clientHeight/innerHeight等、
名前を決めればいいだけの部分でさえすり合わせ出来ていない点、
あるいはJavaScriptと名乗れずJScriptとなっている点等からしても、
(どちらが仕掛けたかはよく分からないが)何らかの政治的思惑が絡まっており、
W3Cは「使えない」として見切りをつけられているように見える。
(見切りをつけたこと自体は正しいが、それによって我々が不便をこうむっているのはご承知の通り)

136 :デフォルトの名無しさん:2016/05/14(土) 13:48:07.29 ID:Jg6FEyPA.net
> 中央政権的なFlash等プラグインの死
以下を読んだ。
> http://uxmilk.jp/5784
まあ俺も筆者と同意、Flashは死ぬべくして死んだだけ、
ジョブスが引導を渡した形になったのは、ジョブスに先見の明があっただけ、と思える。
実際、今Flashが欲しいって思うことは無いだろ?要らなくなったんだよ。

だから君の
> Webは中央政権的でない
というところが大前提として間違っている。
そもそも、何であっても「中央政権的」ではないんだよ。それが資本主義だから。

例えば、iPhoneが中央政権的であるとしよう。
ではiPhoneがその機能を「搭載」あるいは「削除」したら、他が「必ず」付いてくるか?
答えはNoだ。Flashが必要なら他サイトは対応し続けるだろうし、iPhone側も搭載を余儀なくされる。

例えば初期のiPhoneは「コピペ」機能が無かった。これはジョブスが「不要」と判断したかららしいが、
さすがにこれは3代目くらいで「復活」した。(これについてはなぜいらないと思ったのか謎)
Windows8はスタートボタンを「廃止」したが、誰も望んでいないこの変更は修正を余儀なくされた。
かつてRIMMという先進的DRAMがあったのだが、特許料を取るだけのものだと判明したため、
各社は旧来のDDRをDDR2/3/4と進化させるほうを選択し、RIMMは死んだ。
何かを中央政権的に仕掛けることは出来るが、それを追認するかどうかは市場が決める。
結果的に、無理な仕掛けは頓挫するようになっている。これは資本主義のいいところだよ。

君の世界観が中央政権的なものを肯定するのは、
一般に中央政権的なことが出来る規模のトップにいる奴はかなり優秀で、
そいつらのやったことが正しくて追認されることが比較的多いからだよ。
ただし上記のように、探せば結構間抜けなこともやっている。

137 :デフォルトの名無しさん:2016/05/14(土) 13:49:00.26 ID:Jg6FEyPA.net
だから、それが大多数の人にとって正解と思えるのなら、自然と
> じゃあもう低レベルなAPI群を定義して、もっとオープンに仕様を発展できるようにしよう。
ということになっていく。それは君や俺がどう思おうが関係ない。
ただ、そうなっていないのなら、それはそう認識されてないということだよ。
つまり君の認識が間違っているということ。

asm.jsもServeceWorkerももう数年になるが、これらは君的には普及したと思えるのかい?
あるいは、これらの流れを受けて、低レベルAPIを規定していくことが主流になったと思えるのかい?
俺にはそうは見えないけど。

138 :デフォルトの名無しさん:2016/05/14(土) 13:49:22.05 ID:8701OXOx.net
将来においても絶対に変わることがなくて、
ブラウザの実装者の負担にならない最低限の共通の機能をもったAPI
そしてその共通APIを使ってより便利なことをするライブラリ。

この2つを「標準化」するべきなんだよ。

今現在は、最低限のAPI部分しか標準化されてないから
jQueryやlodashなどがでてきてしまっている。

最低限の機能だけじゃ開発は楽にならないので、
他の別の何かは絶対に必要になる。

139 :デフォルトの名無しさん:2016/05/14(土) 13:49:51.20 ID:Jg6FEyPA.net
> よりオープンなそれこそ誰でもGithubに書いて主張できるような仕様形態に「自然となっていった」。
これは事実としてそうなっているね。
つまり大多数の人にとって、これが「現状一番マシなやり方」と認識されているということ。

ただし、
> バージョニングの弊害の反省
これはjQueryか?
一般的にバージョニングで問題が発生するのは使い方が悪いだけ。
つまり、「仕様」に関わってはいけないレベルの馬鹿な奴らがバージョンを規定するからだよ。
そして必要な機能を「中央政権的」に落としたりするから混乱する。
あるいは変更の必然性が無い(延期できる)部分をバージョンを変えたからといって無駄に変更してみたり。

バージョニングで成功している例は、例えばWindowsだよ。
外面バージョンは、95, 98, Me, 2000, XP, Vista, 7, 8, 10 となっている。
これらまとめて全部 Windows という名詞しかなく、
明示的に分離することが出来なかったら、会話するのに困るだろ。(Linuxがそれに近い状態)

正しくバージョニングが出来ない連中ばかりだからといって、
バージョン自体をつけないのはさすがに間違いだよ。
実際、ES5,6,7, HTML4,5, CSS3,4ってのがバージョンだし、バージョンが付いてない案件はさすがに無いと思うが。
(バージョンが廃止された案件は無いはず。機能していない案件は多々あるとしても)
そして「このブラウザでは、HTML5, ES5, CSS3 まで対応しています」と言い切るためのもの。

140 :デフォルトの名無しさん:2016/05/14(土) 13:50:45.96 ID:Jg6FEyPA.net
ところで、
> Bluetooth機能
これは何?と思って調べたら、本当にあるんだな。
> https://developer.mozilla.org/ja/docs/Web/API/Web_Bluetooth_API
仕様としてはまあ妥当だな。
正直、bluetoothまでWeb側で面倒を見る必要があるとは思えないが、
OSのシステムコールを直接やらせることは出来ないという縛りによって、
OSのシステムコールの再発明を迫られるという間抜けな事態に陥っている。
とはいえ、これについては今後とも再発明し続けるという解しか思いつかないな。
IEEE側の仕様を上手いこと流用する手はあるはずだが、あちらは低レベル過ぎるだろうし。

141 :デフォルトの名無しさん:2016/05/14(土) 16:17:29.52 ID:ciGNYqZA.net
だいぶ意見の摺り合わせがなされた。殆ど言葉の定義的なことやニュアンスの行き違いで
多分経験と立場からくる「常識」などの差を考えれば、根本的な部分の意見の出し方の相違はあまりないと思う。
もうこれ以上は無理だろうけど、明らかに違う部分と、自分の中で強い意見を持ってる部分だけ言っとく。

まずバージョニングについて。
もちろんバージョンが付いてる仕様(ほぼW3Cが中心で策定)も未だ多くあるが、Living Standard版(ほぼW3C以外が中心で策定)の仕様も多くある
HTMLのように両方ある場合、『ブラウザベンダーが見るのは、LS版の方』で、こっちhttps://html.spec.whatwg.org/multipage/introduction.html
(ここの1.6までを読めば多少感覚がわかると思う)

バージョンが付いてる方は、バージョンが付いていないと困ること(例えば製品の対応状況の表明、例えばある時期においての仕様参照)のために、
LS版の方から重要な部分を定期的に抜き出してまとめてるだけのものであって、実際我々開発者にとっては意味のないと言っていいくらいのもの。

まあバージョン=悪いとは言わない。仕様開発においてバージョンにとらわれ過ぎることの弊害というべきか。
そしてLS版はある意味で更新日付がバージョンとも言える。ようは異質な存在というより、もっと回転を早くしていきましょう的なものとも言える。

142 :デフォルトの名無しさん:2016/05/14(土) 16:20:23.84 ID:ciGNYqZA.net
そしてJSらしさについて
そもそもJSらしさとは何なのか?例えばクラスっぽいものを作ろうとした時、
functionと.prototypeを使うのがそうなのか?
それでもって継承っぽいものを実現したいときは、ハックに近い方法で言語の底のプロトタイプ性に干渉し為すのがJSらしいということなのか?
それとも今となってはclass構文と、extendsで実現するのが素直にJSらしいということなのだろうか?

自分はというと、どっちも使う。さらに、__proto__を使ったピュアなプロトタイプベースでクラスシステムを作ったり、mixinもやる。
そしてその全てがJSらしいと思っている。汚い部分も、何でもかんでもやろとする部分もJSらしさだ。
型付配列だってそう。JSに存在しているのだから、それを活用することは当然JSらしいと思っている。

自分はJSに関しては、仕様、策定プロセス、実装(特にV8)も含めて愛していて、自分にとってJSとはその世界全体だ。
いい加減に書けるのもJSだが、「こう書けば速くなります」と言った書き方もJSだと思う。
なぜならエンジンはJS(ES)仕様を実装しているわけだが、実装されたものがJSとも言えるからだ。

昨今標準仕様として策定が完了するためには、最低2つのメジャーなエンジンに実装されることが必要とされているが、
逆に言えば複数のエンジンがきちんとした意思を持って実装したものは仕様と近しいと思っている。
また重要なこととして、各エンジンの最適化は、なにも適当に出来そうなニッチなケースからしているわけではなくて、
世間で使われているコードが速くなるような最適化がなされているのだ。

つまり何がいいたいかというと、曖昧なJSにおいて、比較的きちっと最適化パターンに沿って書くのは、
テクニカルというより、『お行儀が良い』行為なのだ。

そして、asm.jsについても似たことが言える。TypedArrayを使うのは『良いアルゴリズム』だし、
asm.jsに沿って書くからといって、別にJS道を外れるというわけでもないのだ。
人それぞれ好きなように書けるのがJSだ、と考えてる。

143 :デフォルトの名無しさん:2016/05/14(土) 16:39:37.40 ID:ciGNYqZA.net
>>132
チョット違うな
「ちゃんと」ってのは「ちゃんと」だ。
ただ、「(そういう)ニッチなケース」における、「ちゃんと」だってだけ。
ただ自分がニッチなケースをわざわざ挙げたわけではなく、必然的にそこに行き着くということ。『必然』
「言語」で対比して話しているようだったからDOM周りの外部APIを活用するような、Webにおいて普通のものついては除いて考えざるを得なかった。
ただ1+1を何億回やるみたいなのの延長のマイクロベンチで語ってもあまり仕方ないと思った。
先方がN-Bodyを例に出していたので先にそちらにも触れたが、もうちょい大きな実用物でもそう言えるということを書いた。

そしてそのもうちょい大きな計算主体な実用物ってのは、自分が思い浮かんで良く作ってる中だと、
ゲームの先読みAIか、エンコーダ的なものかしか思い浮かばなかった。
だから前者のようなものでは1/2、後者ではまだSIMDとパラレリズムの実装が不十分な段階だから、もう1/2にはなるよと説明した。

別にそれはJSで書かなくてもいいと言われれば、勿論そのとおり。
でもJSで書くとなったとき、これらをJSで書こうとする微変態が「ちゃんと」書くとは、
当然最低でもボトルネック部分はasm.jsスタイル、そしてSIMD、SAB、AtomicsみたいなAPIも使いたいと思うだろう
(実際に対象の互換性を考えて使えないこともあるとかはおいといてね)という前提や思考の流れで書いた。

144 :デフォルトの名無しさん:2016/05/14(土) 17:31:31.31 ID:ciGNYqZA.net
ここまでの流れ、ちょっと狐につままれているような感じだ。
自分としては歴史や試した経験事実に沿って、淡々とお話した部分が多い。
別にこの宇宙において何が善悪かを語ったつもりもなく、一例を挙げたりしながら部分部分に対して必然的な事柄を語っただけだ。
だからバザール型云々の話も意図的にスルーしている。

本来は何が正しいのか、歴史のどこが間違っていたのか、を語りたいのではなく、
今はどういう状況で、それに沿って今からどういう心構えでいればいいのかを把握し、
一緒にWebを良くしていこうねということがしたかったからだ。

もしかすると例えば自分はその低レベルAPIが大成功すると考えてると思われてるのかもしれないが、べつにそうは思っていない。
策定に関しても、難しさは高レベルAPIと同じくらいだろう、と書いたように別に現状と大きく変わるとは思っていない。
ただ、そーゆーじだいなのよー、いーものつくってほしーね、ってだけ。

まあ、そういうわけなので、そもそもダメ、とか言うのは今回の話においてタブー視していた。
そもそもダメ、それも代わりにこっちの方がいいという案も出してくれてはいるものの、過ぎたことだったり、現実そうはならないことばかりだった。
今の流れに沿った上で、こういう風に改善していく道があるんじゃないかと具体的で現実的に示して欲しかった。
(現実的というのは、今からメーリングリストで発言すれば多少は風向きを変えられそうなくらいな意見をイメージしている)

まあできれば、APIレベルの改善点を挙げて欲しかった。
こういうAPIが良いんじゃないか、だから抽象的一般的にこういうことが言えるんじゃないか、
だから今のWebのこの流れは間違ってるんじゃないか、とね。

そうじゃないと、Webはそもそもがダメ、それを素直に直すのは無理、じゃあWeb捨ててネイティブ行くか!ネイティブ最高!
くらいしか考える事、言うこと無いよね、って思った。

466 KB
新着レスの表示

掲示板に戻る 全部 前100 次100 最新50
名前: E-mail (省略可) :

read.cgi ver.24052200