このスレッドは天才チンパンジー「アイちゃん」が 言語訓練のために立てたものです。 アイと研究員とのやり取りに利用するスレッドなので、 関係者以外は書きこまないで下さい。 京都大学霊長類研究所
おつ階梯
scalaで作ったプログラムをexecutable jarで配布するときは、scala-library.jarも梱包しないといけないんだけど、そのときのscala-library.jarとscala-swing.jarの配布のライセンスを知りたいけど、英語が読めません 誰が和訳がどこにあるか教えてください
7 :
デフォルトの名無しさん :2013/04/02(火) 18:38:02.94
>>3 itproの会員登録ってメアドの他に
何を入力させられるんですか?
8 :
デフォルトの名無しさん :2013/04/03(水) 00:41:20.77
>>7 日経BP共通アカウントになるからITPro以外でも使える。
登録はメールアドレス、パスワード、名前くらいだったと思う
個人情報が気になるなら、偽名使えばいいじゃない
俺の場合メールアドレスは無料Web mail、名前は偽名
住所、電話番号、生年月日が必須なサイトでも架空のデータ
なるほどわからん だがPythonのリスト内包とPHPのarray_*には殺意を覚えるほどには分かった
概念的な包含関係気にせずに 「Scala的には関手はmapでモナドから値を取り出すのはflatMapです」 と言い切ってるから素人目には良い説明なのかどうなのか判断つきません
限定的な側面だけを全体と勘違いしてる時点で理解してないだろうな
ブコメで空圏を引き合いに出して言い訳しているところが笑いどころですね トリビアルな例だけ出してればそりゃ「圏論とかモナドなんて簡単」だろうとw まー4月になると学術的権威主義を傘に来て新卒後輩を脅しつけるただの季節老害なんだろなと推察
「モナドという表現を(無理して)使うと、けっこうたくさんのこと(全部ではない)が統一した枠組みで表現できる」 ということを「モナドで実装すれば何かいいことがあるはずだ」と勘違いしてはいけない
AspectJみたいなかんじで Function1とFunction2をhookしたいんだけどどうやって書けばいいの?
元々AspectJはコンパイル時に頑張るタイプだった load-time weaveになったのはAspectWerkzと統合された後 (AspectWerkzは元々compile-time, load-time, runtime weave対応) そのAspectWerkzの開発者だったのがAkka作者のJonas Bonér これ豆な
Manifestって実行時型情報なの? 使ったら負けだと思った方がいいの?
2chのスレ読み込んでスレの内容で画像の内容を解読してURLから画像をダウンロードして自動でファイルのタグ付して月ごとにフォルダ管理するソフトをjavaで作った スレの内容を判別するルールベースの部分がscalaになってる このくらいのことなら、みんなやってる
____ / \ / ─ ─ \ / (●) (●) \ ない ない | (__人__) | \ ` ⌒´ ,/ r、 r、/ ヘ ヽヾ 三 |:l1 ヽ \>ヽ/ |` } | | ヘ lノ `'ソ | | /´ / |. | \. ィ | | | | |
CUIの2chブラウザをscalaで実装した
>>24 あ、それほしい。
べ、べつに、仕事しているふりして2ch見るつもりじゃないからね!
プロポーショナルなAAはCUIではどう表示するんだろ
端末の関係で文字全部をユニコードに変換してるからAAは表示どころか文字化けしまくってる
じゃあもうしばらくはNavi2chで仕事してるふりして待つわ
Scala使ってる人は、JavaのWebフレームワークと組み合わせて Webの開発やってる人が多いのかな? ScalaユーザはみんなLiftとか使ってるのかと思いきや Liftはさっぱり人気ないことに気が付いた。 Liftもドキュメント読んでもよくわからないし使いづらそう。 Play!もセッション機能がなかったりして汎用性がない。
俺はLiftでやっているよ。 railsから素直に来れないのが弱点と言うことになっているが それ自体はたいしたことない。 それよりもドキュメントが貧弱なのがきつい
>>30 ドキュメントが貧弱、に納得。
数時間、公式サイトを読んだけど簡単なCRUDさえ作れず挫折したw
ドキュメントは概要から順に説明していくのがふつうなのに、
少し読み進めるとアクターモデルとか高度な解説はじめちゃう始末。
Lift開発者は、Railsの元・開発者と聞いて期待してたけど、
LiftとRailsでアーキテクチャがぜんぜん違うんだよね
どうしてこうなった、という感じ。
ViewFirstってわかりづらい
ドキュメントも2011年のままで、長らく更新されてないし、
Lift開発者のやる気もなくなってきてる感じがするわ。
>>32 ?どういうこと?
Play!はJava EEを使ってなくてJavaのSessionに該当する機能は
使えない、とどこかで読んだ。
Play!のフレームワーク自体がステートレスに設計されてるはず
>>33 掲示板の書き込みと画像のアップロードとミニwikiとちょっとJDBC使うくらいなら、そもそもセッション使わない方が綺麗に実装できる
フレームワークに沿ってコーディングする利点がない
36 :
30 :2013/04/22(月) 23:17:05.81
javaで作ったサーブレットと共存させながら面倒臭い部分からscalaのコードに置き換えていってるから、当分はtomcatに毛が生えたサーブレットコンテナのままです 企業とかもたいして変らわない予感がする
へ〜、ステートレスでセッションの仕組みが無いならログインとかはどう扱うのだろうと思って 調べたらSession IDを使うステートフルな認証認可モジュールが出てきた。 まぁ、そうなるかな。
ステートレスってデータを全部DBとcookieに納めて、 アプリケーションサーバがステートを持たないって意味だから 全体としてはステート自体は持つから。 単にサーバを分散しても管理しやすいってだけなんで、 どうせサーバが一台しかない小規模用途なら lift方式はラクチンでいいと思う
関数(主にパターンマッチ) OOP Eclipse vim plugin 軽いコンパイラ書くなら scalaが最適かな、と思いました
そもそもscalacが重い件
軽く、に訂正
>>35 akkaご推奨のPlay-miniのrouteはUnfiltered前提だな
>>29 既存のjavaのフレームワークだと関数型っぽく書かなくなるんだよね
関数型なにそれ美味いの?ってなメンバーが多いときは取っ付きやすいからありだが
だったらscalaじゃなくてもよくね?になりがち
object MainFrameSample extends SimpleSwingApplication{ def top = new Frame{ title = "Window Title" minimumSize = new Dimension(250,400) // cursor = new Cursor( Cursor.HAND_CURSOR) resizable = false menuBar = new MenuBar() {contents += new Menu("menu1")} } } こういうウインドウを出すオブジェクトを別のオブジェクトから呼びたいんんですがどうすればよろしいのでしょうか? eclipse でかいてるんですが 実行時に MainFrameSample オブジェクトを選ばないとウインドウが出てこないんです
class F extends scala.swing.Frame { title = "Frame test" override def closeOperation() = dispose() } 宣言をこうして呼び出すとき val af = new F(); af.close(); af.size = new Dimension(200,300); af.title ="XHHHHtTH" af.visible = (true) println("xxxxxx") こうしたらうまくいきました ありがとうございました
がっかりpattern matchに泣ける
メモ sbt環境で -X:print オプションつきコンパイルしたいとき > set scalacOptions in Compile += "-print" > compile
パターンマッチングで string s1 を その場で定義した正規表現 r1でマッチするかどうか調べ、更にその際一部分を x,y,z に拘束しておき マッチしていた場合 別のオブジェクトの関数 o1.f1(s,t,u )に 適用して o1.f1(x,y,z ) を評価する、ということをやりたいんですけど scalaでできますか?
とりあえずなんでもアルファベットの後ろに数字つけて変数名にしちゃうMS文化って滅びればいいと思います
val s1 = "x=10,y=20,z=30" val r1 = "x=([0-9]+),y=([0-9]+),z=([0-9]+)".r object o1 { def f1(x: Int, y: Int, z: Int) = println(x, y, z) } s1 match { case r1(x, y, z) => o1.f1(x.toInt, y.toInt, z.toInt) }
>>54 ありがとうございます
r1 を無名関数なので match{ } の内側で定義するのは無理なんでしょうか?
object o1 { def f1(x: Int, y: Int, z: Int) = println(x, y, z) } implicit class RitchRegex(sc: StringContext) { def r = new util.matching.Regex(sc.parts.mkString, sc.parts.tail.map(_ => "x"): _*) } "x=10,y=20,z=30" match { case r"x=(\d+)${x},y=(\d+)${y},z=(\d+)${z}" => o1.f1(x.toInt, y.toInt, z.toInt) }
typo s/RitchRegex/RichRegex/
>58 これを見て 「>57レベルの人でも、やはり正規表現を使った操作は/〜/〜/形式が一番直感的なんだな」 と思った。
>>57 ありがとうございます
すごすぎて
すぐには理解できませんが精進に努めます
parser combinator で p ^^ f succeeds if p succeeds; it returns f applied to the result of p. ってのは f( (result of p) ) ってことですか?
だとしたら f applied to the result of p. って 文法がちょっとおかしいような
>>62 コードで表現したいこと(意図)とScalaコードごちゃまぜにして書かれてもわからんので
せめて意図は //期待している挙動
みたいにコメントで分けて書いてくれ
「pのパースに成功したらその結果がfに適用され処理される」ということだから何もおかしくない。 case class Vector3(x: Float, y: Float, z: Float) object SampleParser extends scala.util.parsing.combinator.RegexParsers { def parse(in: String) = parseAll(vec3.*, in) def vec3 = number ~ number ~ number ^^ { case v1 ~ v2 ~ v3 => Vector3(v1.toFloat, v2.toFloat, v3.toFloat) } def number: Parser[Double] = """\d+(\.\d*)?""".r ^^ { _.toDouble } } SampleParser.parse(""" 1.1 2.2 3.3 4.4 5.5 6.6 """)
^^はmap >>はflatMap
>>63 > だとしたら
> f applied to the result of p. って
> 文法がちょっとおかしいような
日本人的には違和感あるけど
f(x)のことをf applied to x(xに適用されたf)
ということもあるようだ。
case classをextendしたcase classを作ると applyとunappyがうまく自動生成されなくなる (extractor書けとか言ってくる)んだけど これはそういうものなの?
case classをextendしたくなる状況が理解できないけどそういうものです
++= の意味がわからないです。
x ++= yはx = x ++ yと同じ
x ++ y もわかんないんですけど…
何がわかるんだ?
>>69 case class Employee(name:String, salary:Int)
みたいなのに
case class SalesRep(customers:List[C]) extends Empolyee
みたいなのってしたくないですか?
>>74 したくないです……
その例だったら
case class SalesRepo(employee: Employee, customers: List[C])
とか、単に (Employee, List[C]) のタプルで済ますとか
>>74 したいけど、それをやるとオブジェクトの等価性で問題がでるために禁止された
>>75 したくない理由をもうちょっと詳しく教えてもらえる?
こういう継承って古典的なオブジェクト志向のよく出る例だけど
なぜscalaではダメなのか?
型情報も両方で基底の型としてEmployeeを使いたいときどうするの?
それともtrait使って混ぜ混ぜの方がscalaだと流儀なの?
>>77 Scalaではダメってわけじゃない。case classでダメなだけ
なぜならcase classは(オブジェクト指向の)抽象データ型ではなく(関数型の)代数データ型だから
代数的データ型だというならML系やHakellの用に楽に定義出来る構文糖欲しい
基底traitをsealedすればよくね?
論理的にはそれで大丈夫なんだが字面的に面倒じゃない?
慣れ
scala盛り上がってるかい?
ぷえーい
Scala 2.10.1でManifestがdeprecatedになって scala.reflect.runtime.universe.{ typeOf, TypeTag, Type }になったけど おかげでtype erasure回避しやすくなってるね
scalaのAndroid SDKが欲しい
>>86 試してみた。これからはshapelessなくても生きていけるかも
class HMap {
import scala.reflect.runtime.universe.{ typeOf, TypeTag, Type }
private var m = Map[String, (Type, _)]()
def set[T: TypeTag](k: String, v: T): Unit = { m += k -> (typeOf[T] -> v) }
def get[T: TypeTag](k: String): Option[T] = m.get(k) flatMap {
case (t, v) if t <:< typeOf[T] => Some(v.asInstanceOf[T])
case _ => None
}
}
scala> var hm = new HMap
hm: HMap = HMap@272772b1
scala> hm.set("hoge", 1)
scala> hm.set("fuga", "moge")
scala> hm.get[Int]("hoge")
res76: Option[Int] = Some(1)
scala> hm.get[String]("fuga")
res77: Option[String] = Some(moge)
scala> hm.get[String]("hoge")
res78: Option[String] = None
Scalaの何がいいのか産業で
Haskellは難しすぎて僕にはむりだったけど すカラならOOPを足がかりにして緩やかにFPへシフトできるから きっと君もスキになれる
>>89 そこそこ強力な言語だし、それに名前がかっこいい
名前がダサい言語は使う気になれん
F#とかさw
アルファベット1文字w + しゃーぷwwだっさ
エフシャープwwww恥ずかしくて口に出せない
アルファベット一文字の適用範囲的最強言語C言語様がみえないのか?w
Dの悪口はやめて
94 :
デフォルトの名無しさん :2013/06/07(金) 22:11:35.64
D is disrespected always.
Deprecated Language?
D言語最強伝説
ドヤ顔でDとか言ってるくせに、〜100行程度のトイコードしか書いたことのない馬鹿w お前らがちゃんと貢献しないから、いつまで経っても5流言語なんだよ? はやくC++を駆逐しろよ
ScalaではClojureに勝てないことに気がついてしまった・・・ 今までJavaプログラマをバカにしていたが、Clojureプログラマからはバカにされてる・・・ 高校生になったから調子にのって中学生を見下していたら、それを見ていた大学生に苦笑いされた そんな気分だ・・・情けない・・・さようならScalaプログラマ()・・・
おう、じゃあな
D(笑)
Scalaって結局どこが良くて支持されてるんだ?
かっこよさ
JAVAからの敷居の低さ
関数型言語の入門に丁度良いと思う、Java使ったことがある人が前提だけど
javaのライブラリが使えてjavaよりもっとオブジェクト志向で、関数型で型チェックが強力
標準コレクションライブラリの出来の良さ
パターンマッチ
Scalaは名前がオリジナリティ無くてダサい。 むしろそれだけがネック。
【IT】 「C言語やJavaを使う人は採用しない」「AGKやDarkBASICの方が生産効率が高い」就職活動
http://kohada.2ch.net/test/read.cgi/pcnews/1365242417/139-141 コンソール研究所は13日、C言語やJavaを使う学生を採用しない方針を固めた。
これは昨今のソフトウェア開発現場において社内研修期間を嫌う企業や官公庁の意向を取り入れたもので、
「 卒業=即戦力 」 が求められる新時代への突入を明確にしたものである。
たいていの面接官は ” 学生時代にどんな部活に所属していましたか? ” などと聞くが、それは時代遅れと
なったようだ。
また、C言語やJavaのスキルを問うものに対しても、「 実務経験がなければ意味がない 」 と言う現場の声も
反映した。
コンソール研究所の開発現場から一人の声を拾ってみた。
(以下ソース参照)
112 :
デフォルトの名無しさん :2013/06/16(日) 16:39:03.59
俺はスカラよりスケーラのほうが良かったな
class oneConvert(fst : Char,snd : Char){ val fst = this.fst; val snd = this.snd; } みたいに書きたいんですが怒られてしまいます おとなしく変数名と引数名を違えるべきでしょうか?
class oneConvert(val fst: Char, val snd: Char) { ...
逆でした public Employee(string name, string alias) { this.name = name; this.alias = alias; } ↑みたいにしたかったんですがあきらめて class oneConvert(arg_fst:Char,arg_snd:Char){ val fst = arg_fst; val snd = arg_snd; } としますた
いつのまにか2.10.2が出てた
JavaScriptを殺せなかった(Ajaxで生きながらえさせてしまった)のは
今世紀最大の失敗だったと思うわ
TojiCode: A Tale of two Web Technologies
http://blog.tojicode.com/2013/06/a-tale-of-two-web-technologies.html コメント欄など見てると、もう駄目だよこれ\(^o^)/オワタ
JavaScriptの置き換えも改善も期待しないほうがいい。
DartもPNaClも政治で潰される。asm.jsはどう考えてもLLVM→asm.jsの変換時間やマルチスレッド対応で躓く。
ウェブはJavaScriptと心中だ。
つかBrendan Eichの老害っぷりがぱない
というより、あれこれ理由をかこつけて自分が作ったJavaScriptを守りたいだけなんだろうけどさ。
JavaScriptやasm.jsに疑義を呈するブログやツイートに片っ端から突撃してくる必死っぷりが心底うざいw
そろそろHTML/CSS/JavaScript全部スクラップにして
第二のウェブを作ることを考え始めてもいい頃合いではないかと思う。
野心ある人はもう取り組んでいるかもしれん。
Scala終わったかもね。はじまってもいないけどw
IDEはまだストレスあるし、APIの日本語版もまだない Javaからのステップアップが簡単と書かれてる本は800ページ近くあって、本当に簡単なのかと 実際これIT土方が使えるのかな、業務で取り入れてる人っている?
API日本語版はなくてもいいけど、JavaのAPIとの関係と不具合をまとめた本がほしいです
API日本語版は今後もなさそ。Typesafe社はそこまでやるマンパワーないだろうし そもそも日本で普及するかする見込みがないとやる意味ない Javaをちゃんと分かってればステップアップ簡単だと思うけど、>122の文脈でいうIT土方だとどうだろうね 逆に中途半端にJava知らない方がScala自体は簡単かもしれないが、ハマると結局Javaの知識も必要 日本で2chから近いところでいうとニコニコのバックエンドはScalaに切替中らしい
関数型言語だから細かい部分まで手がとどかないって書こうとしたけど、よく考えたらjavaでも細かい部分まで手が届いてなかった
java知らない土方なんていねーよ
javaを使っているが、java6以降を触わったことすらない土方ならいる
>>124 今時、英語くらい読めないとIT土方も難しいよね。
世界中に、英語読めるIT土方が居る時代だし。
> 日本で2chから近いところでいうとニコニコのバックエンドはScalaに切替中らしい
逆に現状のニコ動のバックエンドって何だろう?
C++だったような気がする
そんなとこいじるよりジョブスの遺言を守ってFlash Playerを何とかするべきなんじゃないの?
なんでscalaスレでキモイ糞ップルの話が出てくるんだ
WEB+DBなどで、C++にしている箇所の話はあったと思う。
うちの会社は、プレゼン用のプロトタイプをscalaで作る 3時間で作ったプロトタイプだけど、C++で実装してリリース可能になるまでだいたい3ヶ月かかる だからと言って、scalaで作ったモノを売ることはない 他の会社も同じだと思う だから「scalaで作った」はあんまりまにうけない方がよいかと
どの言語をどう使おうと勝手だけど Javaならともかく最終的にC++で実装すること前提なら Scalaでプロトタイピングってトータルでみて効率的じゃないような? Scalaを使う効果ってどんなもん?
Twitter「Scalaで作った」
ソフトウェアプロトタイピングにおける、最終製品への開発にコードを流用しない という制約を厳守できるという効果は大きいだろ
138 :
デフォルトの名無しさん :2013/06/23(日) 14:53:21.60
ニコニコとScalaで検索するだけで製品コードレベルでScala使ってる資料が見つかるけどな
C++をC++として使い倒す能力があるならば Scala でプロトタイプするのは非現実的かもしれない
C++でもラムダ式やら範囲ベースのforやらのあるC++11と それ以前ではだいぶ違うと思うけど とはいえまだC++11普及してないよね
実務経験あるなら分かると思うけどプロトタイプをそのまま製品へ流用する誘惑に負けて、 結果プロジェクトが破綻することがままある だからソフトウェアプロトタイピング手法ではプロトタイプコードを捨てろと明言してる 能力がどうとか言う話じゃないんだよ
プロジェクトが破綻するのは プロトタイプを流用していることが直接の原因じゃなくね? プロトタイプコードを捨てるのが有効であるとして Scalaが最終製品として使えない理由にはならないし
プロトタイプで学習したことを生かして再設計しましょう、という話なら分かる。 Scalaで開発できる人間を必要なだけ集められるかは、重要ではあるけど別の問題。
>>134 そういうのは、聞いたことのある範囲ではあまりないなあ。全面採用ではなく、APIサーバだけScalaとかそういうのはちょくちょく聞く
ただ、日本のいわゆるSIerでScala使ってるところは少なくて(SIerだと採用しづらい事情はわかる)、国内採用事例は
もっぱらWebサービス系のBtoCな企業に集中してる。特にWebサービス企業のバックエンドは技術選択の自由度高いことが多いし
日本以外の話でいうと、Twitterとか、LinkedInはいうに及ばず、Webサービス企業が普通にScala使うのはさほど特異なことでもなくなってきてる
ただ、日本でなくてもいわゆるエンタープライズとWebサービス企業(主にBtoC)の壁はまだ厚いようで…。その辺は、Scala Days 2013のKeynoteで
感じたことでもある
ちなみに、著名なScala採用事例として語られるTwitterとか、実際どうコード書いてるのよとか知りたいならその企業のgithubリポジトリ覗くといいと思う アピールのために一部公開という形じゃなくて、結構内部向けに書いたと思しき泥臭いコードを公開してるのは結構ある。あとは、Scala採用企業に 勤めている開発者のgithubリポジトリにも、微妙に内部向けっぽいコード(もちろん、秘密情報は入ってないけど)が公開されてることもある
プレゼンした直後に、顧客の目の前でプロトタイプに顧客の要望を取り込めるのがscalaの利点 当然、プロトタイプどまりだが、その場はしのげる
ブラックな顧客がプロトタイプをみて 「もうできてるじゃん!こんな簡単にできるならお金払わなくてイイヨネー」とか 「こないだできてたのに、まだできてないってどういうことなの?」とか アホなことのたまったときどう対処しているのかぜひ教えてほしい
スレチ
プロトタイプにはないエラー処理と入出力の処理が製品化されたコードの97%になることをきちんと説明できるかがカギ
物流管理システム「Solvo」がScalaとの連携をサポートしてるらしい。ロシア製
Solvo.WMS (
http://www.solvo.ru/support/docs/docs_en/Solvo.WMS_en.ppt )
Integration (
http://www.solvo.ru/en/products/wms/Solvo.WMS/wms_technologies_and_erp_integration.php )
Solvo.WMS provides integration features to interface it with ERP
systems, such as Monolith, Galaktika, Parus, Domino, AX, Microsoft
Dynamics Nav, Scala, JD Edwards, Oracle E-Busines s suite, SAP R 3,
etc.
iScalaって紛らわしいERPシステムもあるな (Google八分にしてほしい...)
あくまで八分であって十分ではないんですよね
>>147 これは張りぼての車を人が被って歩いてる状態です。
ハード系の顧客ならモックアップって説明すると通じる
>>157 あってる
暗黙変数の変数名は便宜上のものなので、例としてあげられているコードの文脈において implicit val x の"x"に意味は無い。
「Intという型に対して10という値が暗黙のうちに適用される」ことを示しているに過ぎない。
すなわち def f(x: Int)(implicit y: Int) の引数 x に適用されるのではなく y に適用される。
まあ、
>>157 が言いたいのは、だったら例として最初から implicit val y = 10 とでも書いておいてくれれば
理解の助けにはなるのにってことだろうけど、どのみち説明不足なのでこの資料だけから理解しようとするのはやめたほうがいいよ。
WebフロントをScalaで開発「Scala.js」
http://www.moongift.jp/2013/06/20130625/ Scala.jsを使うとWebフロントエンドの開発においてもScalaを使えるようになります。そしてコンパイルしてJavaScriptを生成します。jQueryをはじめとするJavaScriptライブラリと連携できますので使い勝手は良さそうです。
、、、だって。 どうよ?
俺のようなアホには使いこなせる自身が皆無なので、 V8エンジンで実行するとJava VMより10倍早くなるという おもしろ逆転現象でも起きない限り静観する
www.infoq.com/jp/articles/resilient-software-with-akka AkkaについてのInfoQ記事がおもしろい ActorやFutureを用いたモジュール疎結合についてと Apache再起動に頼らないリカバリの仕組みを提供することの意義とか Typesafe四天王だけあって方向性にブレがないのが好きだなぁ
>>162 ちょっと訳が意味不明なところがあるんだが。
これらの特性のお陰で、これらのコンポーネントの動作を完全に互いに独立に、
実行するのが可能になり、多分1つのスレッド上で一つづつ実行される
-- 入れ子になったコールスタックがない場合、同期メソッドの呼び出し中に通常起きる --
しかし、異なるスレッド上で並列に同様に起きる可能性があります。
-- 原文 --
These characteristics make it possible to execute the behavior of
these components completely independently of each other, possibly one
after the other on a single thread -- without the nested call stack
usually encountered during synchronous method invocations -- but
equally possible in parallel on different threads, which may in turn
be scheduled on the cores of a single server or even on different
network hosts.
-- 意訳 --
これらの特性のお陰で、コンポーネント同士の動作を互いに完全に独立に実行
できる。ともすればシングルスレッド環境で -- 同期メソッド実行中に通常起
こり得る「呼び出しスタックが入れ子になる(=deadlock)」事もなく -- 逐次的
に実行できる。さらに、単一サーバー上の複数コア間で実行がスケジュールさ
れたマルチスレッド環境や、異なるホスト間をネットワークで結んだ環境であっ
たとしても、異なるスレッド間で並列に実行できる。
機械翻訳にちょっと手を加えただけみたいだな まぁ、記事紹介してくれるだけもありがたいと思うべきか
最近、世間では統計とかビッグデータの解析とかが流行中の流行だよね。 どこもかしこも、統計、統計って言っているな。 プログラミング言語も、ここ1,2年で R言語が人気急上昇らしい。 その辺、Scalaはどうよ? Scalaとか、HadoopとかMahoutとかWekaとかJava系のライブラリとの親和性が高いのだから もっと利用されても良いはずなのだが。 まあ、ScalaというかJVMは、Visualizationが不得意なんだよね。いまいち、GUIが垢抜けていない。 JavaFXがもっと発展していればよいのだけど。
ScalaLabでどうよ
Sparkだろ
Information visualization系であれば今ならWebでUI作って簡単な可視化であれば Google Visualization Toolkitその他、凝ったものであればd3がトレンドだと思う。 よほどのことでない限りWeb UIで大概は用が足りるようになってきたし、Web向けの Infovisツールキットに関しては何となくd3で勝負がついた感がある。 Plot系やScientific visualizationに関しては確かにJVM系は弱いね。 というかこれらの分野はRとPythonとC以外はどれも弱いと思う。
べつに無理に全部Scalaで固める必要ないやん 好きな言語でCSV出力してプロット用の環境へ渡せばいいだけ
いわゆるビッグデータ解析の話でいうと、
>>168 の言ってるSparkの注目度が去年から今年で急上昇してる
数年前登場した時点ではあくまで研究用途という感じだったけど、今はYahoo, Intel, ...とかindustrial
な事例が増えてきてる。Scala DaysでもSparkのセッションは満員お礼という感じで、Akka関連に次いで
注目されてた気がする。HDFSを簡単に活用できたりとか、Hadoopとの連携がしやすい点等はHadoop
使ってる企業にとっては魅力的なのかも
>>166 Hadoop やるのに自分は Scala 使ってるよ。
Visualization ではさすがに使わないけどw
>>171 Spark いいね。ASF の incubation になったから、どんどん使われると思う。
Visualizationといえば、JVM系であるProcessiingが有名だったな。 ScalaとSparkでデータ処理して、Processingでビジュアル化すれば最強か。
Processing は名前くらいしか知らなかったけど、JVM 系なのか。評判とかどうかしらん。
g8の作者が放置しているspdeのことも思い出してあげてください…
むしろ忘れてやれ
>>174 Processingは、オライリー出版から、たくさん本が出ているし、
いわゆるDataVisualizationの最初のブームのきっかけだよ。
立ち読みしてみれば、有名なサンプルがいくつものっていて、あ、これがProcessingか、となる。
だけど、ScalaからProcessingを連携するためのspdeが放置状態なのは、、、残念。
>>177 丁寧に教えてくれてありがとう。興味あるので、本屋さんでチェックしてみるよ。
しかし、Scala からの連携がその様子では…惜しいな…
>>178 SPDEは、Scalaの文法でProcessingを動かすためのフロントエンドであったり、IDEみたいな環境だったりする。
SPDEがなくとも、ProcessingはJVM系だからクラスレベルで連携できるよ。
もっといえば、ProcessingはSwing使っているので、Swing経由で。
、、、でも肝心のSwingが今時のGUIとして垢抜けないんだよなあ。
swingとscalaの関係を書いた本がほしいです
181 :
178 :2013/07/03(水) 23:38:14.81
>>179 トン。なるほど、そういうことですか。それなら直接連携できそうですが、
Swing は確かに垢抜けない感じでしたね…出た頃に少し試しただけですが。
でも、なかなか面白そうなんで、Processing に少しさわってみようと思います。
spde には IDE も用意されてるなら、誰かメンテしてくれんかしらん…
>>180 Scala の入門書は多いけど、応用的な本はまだ見ないですよね。
日本語の本しかチェックしてませんが。
scala の日本のユーザ会のサイトって、何でずっとお休み中なんだろ。
windowsのL&Fを使っても微妙なんだよなswing そうだ!SWTを使おう!!
Linux でも cool に表示されるのかしらん。
既に過去スレで話題にはなってますが、今の時点で Scala 向けの Web フレームワークって何が良いでしょうか。 やはり Play が良いのでしょうか。(スレは過疎ってるようですが。) Lift は流行ってる気がしませんし。というか難しい印象。
tomcat最強
仕事でも使いたいなら、Tomcat だろうなぁ。
scalaをwarに固めてtomcatアプリ作れる方法知ったら、あとはずっとtomcat
189 :
185 :2013/07/05(金) 18:35:32.56
皆さん、ご意見ありがと。 Tomcat 最強でしたか。Scala 初心者で思いつきませんでしたが、勉強してみます。
微妙に不親切なアドバイスだと思う。
lift with scala on tomcat
tomcatはコンテナであってフレームワークじゃなくね? よっぽどプリミティブなサイトじゃなきゃtomcat使うにしても もう一段レイヤー重ねないか?
>>192 便利なフレームワークも半年たったら忘れるから、結局プリミティブ最強という話
下手すると半年後に公式が消えてる
>>192 だよね。
tomcat だけだと、servlet を書くってことかしらん。それはさすがにキツイような。
servletはjavaでフォロー入れれるのが好き
Playってサーブレットコンテナ使わないの?
scalaのwebフレームワークの本が出ないのは、javaのサーブレットで充分だからだと思う
>>196 PlayはServletじゃないから
>>193 うちは今んとこJSやApplet向けのWebAPIにだけScala使っててsevletでやってたんだが、
普通にウェブサービス作るときも素のservletでやれるのか
>>196 作者によれば、最初のバージョンは、servlet で実装してらしい。
けど、やめたとか。
>>198 自サーバや趣味なら、tomcatにwarファイルを置くサーブレットで十分
業務用はscalaのフレームワークじゃ無理
せいぜいプレゼンで見せる程度
結局C++で実装されられてる
飯を食うためにしかたなくやるWeb系は いろいろめんどくさくないweb2pyでいいわ gaeへのデプロイも何も考えずにできるし 型付き言語を理解できないアホのメンテも不要だし で、浮いた時間をScalaに費やす
結局、業務では使えないんかい … 流行らんわけだw
仕事で使うには、Scala 使いが少な杉。
その仕事や業務の分野にもよるな 経験豊富なScala使い100人必要って分野には厳しいだろうけど
>>206 100人は論外だとしても、1プロジェクトで10人集めるのも厳しいと思うがねぇ。
しかし上の記事にある、Haskell 2万3千ステップに10人で半年、って笑うとこかいな?w
どんだけ人余ってるんだよ…
>>207 Web 系の小規模なシステムで実績を作るのが良いでしょうね。
>>205 scalaAPIが外部ライブラリに入ってるけど、ソースファイルにscalaのコードがないとかザラ
たぶん、納品レベルで、scalaを変な使い方してjavaのコードを自動生成してる連中がいる
うわぁ、ありそうな話しだな…
scalaのAPIは出典明記して警告的なヤツをコピーしとけばフリーだからな
>>210 変な使い方しなくてもPlayのようにScalaで書かれたライブラリをJavaで使うことも出来るよ
1. scalaAPIを使ってるjavaライブラリを使ってる。 2. javaから直接scalaAPIを使ってる 3.実装はscalaで作ってjarにして、手続きはjava 4. 手続きもscalaで作って、classをjavaに逆アセンブルして納品(javaだと問題になる関数名とかあった気がする) 直接関係ないけど、共通部分の実装はjava,scalaで、毎回書き換える手続きはclojureって話は聞くね。
納品先の品質管理部門(FとかN)が低能でjavaしか受け付けないからそんなことしているの? 日本のソフトウェア産業ってほんと腐りきってるネ!
>>215 海外のプログラマは、
言語がどうのこうの言う前に、とりあえず「使えそうだったら作ってみる」、ってスタンスだからな。
当時無名だったRubyを使って、RubyOnRailsが作られたて世界中で使われるようになったら、
ようやく日本のプログラマがRubyに興味持ち出して、日本発とかちやほやするようになったのは有名な話。
>>205 日本人は、自分で作る前に、世界で流行っているかどうかばかり気にするからねえ。
今流行の分散処理システムでビッグデータ解析みたいなのには、Scalaが一番適していると思われるので
この辺で誰かがキラーアプリつくってくれれば、日本でも皆がScalaを使い始めると思うよ。
ビックデータというかHadoopを基盤としたソフトウェアスタックの上で何かをしたいのであれば 現状はScalaは使えるにせよScala単体ではなくJavaとScalaの両方が必要になるね。
>>217 いまどき、言語は一つしか知らないプログラマなんてありえないんだから、
逆に考えて、Javaの資産が使えるっていうのは、Scalaの大きな強みのはず。
OracleがJavaを手放したらだいぶ世界が変わるだろうなあ。
JavaFXでも、Data Visualizationで良さげなフレームワークあるなあ
Dex is a JavaFX application which aims to provide a general purpose framework for data visualization.
http://www.javainc.com/projects/dex/Dex.html だれか、この辺のフレームワークとScalaを使って、カッコいいプレゼンしてくれないかなあ。
rubyはrailsに名前変えようぜ
俺に返すつもりならば 捨ててくれ
?
>>215 仕様書でインターフェイスを指定されてるから表面はjavaにせざるをえない
外国の注文もだいたい同じ
受託は仕方ないだろうが…
速報 後方互換性の問題でエンプラ断念!らしい APIの変更はメジャーバージョンのみとなってるけど、そうなるか。 linuxのディストリビューションみたいにLTSがあればいいのかな。 10年20年になると難しいのかな。
いつの話? API変更はメジャーバージョンのみって2.10から既にそうだけど
また無知蒙昧編集者の曲解フィルタがかかったのか
>>227 最初は better java でもいいと思う。
でも、関数型の理解がないとすぐに行き詰まる。
関数型を理解しようと他言語を知るとScalaの冗長さが気になる
ハイブリッドというと聞こえがいいか、中途半端だからな。
>>229 せめて、おまいさんがレスした
>>227 の記事見てから、意見言えよ。
おまいさん、会議で発言するの禁止、とか言われたことあるだろ。
>>232 > おまいさん、会議で発言するの禁止、とか言われたことあるだろ。
229 ではないが、この文必要か?あなたが言われたことがあるだけではありませんか?
>>232 229 なんて一般論述べただけだろ。何でそんな攻撃的なのよ
おまいさん、スレで書き込むの禁止とか言われたことあるだろ。10万年ROMってろwww
理はあんたにあるけどオウム返しはクールじゃないね
236 :
デフォルトの名無しさん :2013/07/12(金) 00:12:55.37
その目気色悪すぎこっち見んな死ね。その目気色悪すぎこっち見んな死ね。その目気色悪すぎこっち見んな死ね。 その目気色悪すぎこっち見んな死ね。その目気色悪すぎこっち見んな死ね。その目気色悪すぎこっち見んな死ね。 その目気色悪すぎこっち見んな死ね。その目気色悪すぎこっち見んな死ね。その目気色悪すぎこっち見んな死ね。 その目気色悪すぎこっち見んな死ね。その目気色悪すぎこっち見んな死ね。その目気色悪すぎこっち見んな死ね。
ゆるゆり始まらなかった、、、
なぜだか自分でも理解出来ないけど、どうしてもScalaは難しいと感じてしまう。 だがらGroovyに浮気してみたけど、こっちを勉強したらしたで、Scalaの型が羨ましくなったり。 まぁ気長に両方やりますかね〜
scala難しい難しい言われるけどどの辺が難しいのかさっぱり分かんない ライブラリ書こうと思ったら難しいのは分かるけど使う分にはそんな難しいことないじゃん みんなscalaに挫折して他言語行くときはscalaのこんな所がクソで愛想が尽きましたクソが!!ってblog記事書いてってよ
2ch自動まとめをやるための文章要約エンジンをScalaで書いていたが 型とパターン網羅性チェックがあればテストは要らないと信じて2000行ほど突き進んだ所で挫折
>>240 それお前が勝手に変な勘違いしただけじゃねーか、テストは書けよ
はい次!
>>241 例で出してるコードtry/catchで囲んであるだけで例外投げてねえじゃん
例外が重いのってスタックトレース生成する部分だろ
>>239 少し考えてみたけど、Scalaは難しい事をしようと思うと「難しい」って感じる。
で、今までの他のメジャーな言語(自分が使える言語)で同じようなことをしようとしたら、先に「めんどくさい」と感じてしまう。その「めんどくさい」の先にはやっぱり「難しい」が待っているけどね。
Scalaは「めんどくさい」を取り除いてくれたんだけど、その結果いきなり難しさと対峙しなければならなくなった。
だから難しさなインパクトが強いのかな〜って。
例外をコンパイラが最適化する方法はMLで盛んに研究されてたよ、かなり昔に。
Scalaが難しいって言われるのはやさしい本が無いせいじゃね? 特にコップ本がよくない 「○○について詳しくは○章で説明する」が延々と繰り返されてげんなりする どこまで読んでもわかった気になれない→Scala難しい 誰かが「すごいScalaたのしく学ぼう!」を書けば解決するはず
業務で使わせろや、つか仕事くれや! これでいいですか?
マ板行けよ
JavaとScalaその他の言語混在プロジェクトのビルドどうしている? Maven?
>246 「Scala逆引きレシピ」じゃダメなん?
>>247 業務で使うならいくらでもできる
「納品」がcやjavaじゃないとダメなんだから、我々ではどうにもできない
受託ではなく自社サービス開発でScalaを使い始めた部署に配属されたラッキーな例だね。 社内ノウハウのない新規技術を採用するにしても上手くプロジェクトの方向性を握って マネージできる人が上にいたんだろうな。 あとAPIのドキュメンテーションがWikiなのはちょっと意外だった。 APIのデザインのたたき台を作るためにWiki上にAPIの仕様を一端書き起こすけれども 開発や運用のフェーズに入ったら基本的にはソースのコメント等から自動生成した ドキュメントを参照するようにしている。
>>251 あれ最初に読む本じゃなくね?
他の入門書読んだ後、手元に置いておくには最適だが
>>253 「Scalaが廃れない」という前提付きの話ですな
>>246 Scala の本が少ないからな、初心者が自分に合う本を見つけるのは難しいかも
俺もコップ本はくどくてだめだった。オライリー本はすんなり読めたんだが
うちの部署は普通に Scala 使ってるけどな。一般にはまだなんかな
表に出てこないだけかと。いちいちscala使ってます発表する会社ばかりじゃないから
成果物そのものはscalaじゃないが、成果物を作るためにならscalaを極限まで使ってる というか、使えるライブラリやコード片があるなら、ありとあらゆる言語を使ってる
>>259 スレチですまんが、PrologやLisp も利用可能?これは茶化してはいない、好きな言語なので
>>260 メモに nomi(20130506夜, 2000) みたいなデータを1万件くらい追加していって、prologで検索するならやってる
lispは学部の演習で作った雑用プログラムをいまだに使い続けてる
trait Thing[-A, +B] { type X def source(a: A): X def sink(a: X): B def apply(x: X): X } def bippy(t: Thing[Int, String]) = { val state: t.X = t source 42 val state2: t.X = t(state) t sink state } これの意味がよくわからん。なんで.X使えるの?
object o2 { println("constructor test"); def f1():Unit ={}; def f2():Unit = {}; } この "constructor test" の表示がo2作成時一回しか出ないみたいなんです。 o2作成時には 実行しないで f1() や f2() 呼ぶたびに逐一実行するようにしたいのです メンバの関数を呼ぶたびに呼ばれる 所属オブジェクトの共通関数みたいなものって作れないんでしょうか? 継承使うべきでしょうか
> この "constructor test" の表示がo2作成時一回しか出ないみたいなんです。 そりゃそうだろ … object の仕様なんだから
>>262 dependent method types
違った。ただのパス依存型
def createTempDir = { def dir(i: Int) = new java.io.File("/tmp", "foo"+i) (0 to 10000).collectFirst { case i if dir(i).mkdir => dir(i) }.get } ------------------------- これ実行すると、 ------------------------- scala.MatchError: 3 (of class java.lang.Integer) # 3 は実行するたび増える at scala.PartialFunction$$anon$1.apply(PartialFunction.scala:248) at scala.PartialFunction$$anon$1.apply(PartialFunction.scala:246) at Test$$anonfun$createTempDir2$1.applyOrElse(Test.scala:30) at Test$$anonfun$createTempDir2$1.applyOrElse(Test.scala:30) at scala.runtime.AbstractPartialFunction$mcLI$sp.apply$mcLI$sp(AbstractPartialFunction.scala:33) at scala.runtime.AbstractPartialFunction$mcLI$sp.apply(AbstractPartialFunction.scala:33) at scala.runtime.AbstractPartialFunction$mcLI$sp.apply(AbstractPartialFunction.scala:25) at scala.collection.TraversableOnce$$anonfun$collectFirst$1.apply(TraversableOnce.scala:133) at scala.collection.TraversableOnce$$anonfun$collectFirst$1.apply(TraversableOnce.scala:131) at scala.collection.Iterator$class.foreach(Iterator.scala:727) at scala.collection.AbstractIterator.foreach(Iterator.scala:1157) at scala.collection.TraversableOnce$class.collectFirst(TraversableOnce.scala:131) at scala.collection.AbstractTraversable.collectFirst(Traversable.scala:105) at Test$.createTempDir2(Test.scala:30) ってなるんだけど、なんで?
>>267 ガード節で副作用を起こしてるから
collectFirstのソース見ればわかるが部分関数に適用する前にisDefinedAtで適用しても大丈夫か判断している
isDefinedAtの呼び出しでディレクトリが作成されてガードを通るが、
実際に部分関数を適用したら既にディレクトリが作成されているのでmatchしない、エラー
なるほど・・・
270 :
267 :2013/07/21(日) 05:38:40.45
Stream 使うわ。 def createTempDir = { def dir(i: Int) = new java.io.File(scala.util.Properties.tmpDir, "foo"+i) Stream.range(0, 10000).map(dir).find(_.mkdir).get }
練習とかじゃなくてJava7ならFiles.createTempDirectory使えば?
272 :
270 :2013/07/21(日) 20:20:50.97
>>271 うん、それは正論なんだけど、いまだにJava5っていう糞環境サポートしなきゃならんのよ
>>227 日経コンピュータ7/11号の紙面みたら
ここの部分、もう少し分かりやすく書いてあった。
日経コンピュータとかまだ読んでる人いるのかw
定期購読しなくても、取り扱いある本屋にいけば置いてあって立ち読みできるよ。
276 :
デフォルトの名無しさん :2013/07/24(水) 09:14:52.39
輪ゴムとかで縛ってはいない?
ビキニおねーちゃんのクリアファイルが付くと紐で縛られるな
日経ソフトウェアは、ここ1,2年前から絶好調らしいよ。 毎回、広く浅いテーマでやっているけど、月刊誌としてはそのほうが買いやすいからな。 Scalaも頻繁に踏襲されている。
val (a,b) = try { 1 / 0; (1, 2) } catch { case e => println(e) } これがコンパイル通るscalaは糞
>>280 どうなればいいの?
関係ないけど、
object A { val 1=2 }
のが衝撃的だよな。言語仕様上コンパイルできて正解だけど。
>>280 コンパイル通るのはそんなに変じゃないと思うが…
scalatraでリクエスト元のIPを見たいんですけどどうしたらいいです?
>>280 (絶対に失敗するけど)パターンマッチ式だからコンパイル通るんだよな。俺も
言語仕様書読んで始めて試したときは衝撃だった
>>280 はたぶん、(1, 2)はTuple2[Int, Int]で、println(e)はUnitだから型エラーになって欲しかった
んじゃないかね。実際はTuple2[Int, Int]とUnitの共通の祖先型のAnyになって、んでもってval (a, b) = ...
は実際にはパターンマッチング+変数宣言の省略だから型エラーにならないわけだが。
またsubtypingで時間を無駄にした if (List(("foo",1)).maxBy{case(_,x)=>x}==1){ println("何故か表示されない") }
maxByで返ってくんの(String, Int)だろ REPLで実行してみたら親切に警告出してくれるじゃねーか <console>:8: warning: comparing values of types (String, Int) and Int using `==' will always yield false
レガシーコードでしかも警告数十個出てるから見逃した テストやリファクタリングなどちゃんとしたいがなかなか現実は厳しい scalaの型がこの状況を救ってくれるかと思ったらそうでもなかった
> 警告数十個出てるから見逃した 救われる気のない奴が救われる訳ないって話? 警告全部潰したら救われるかというとそんなことないだろうけど まずそこからじゃないの
scalaでレガシーコードの保守とかモチベーション保ちにくそう。
JavaからScalaへの自動変換ツール作る方がビジネスになるよな。 おれだったら、 IntelliJ IDEA の変換機能使いまくって プロジェクトリーダーの幻想をぶちのめしてやる。
ScalaからJavaは分かるけど、JavaからScalaは無理でしょう むしろ、classファイルからScalaの方が簡単な気がする
8/20どころか数年前からあるだろ
scalaは関数型言語といえるの?
いやマルチパラダイム言語であり非純粋関数型言語だけど 純粋関数型言語しか認めない主義? Haskell厨なら巣にお帰り
>>289 CコードやJava 5より前のコードの保守とかならともかく
Scalaの警告は基本潰すの前提で考えた方がいいよ
エッジケースはあるけど、scalacが出す警告のほとんどはあまり考えずに指示通りに
簡単に潰せるから警告潰しといた方が良い
>>293 可読なScalaソースを吐くという前提が必要なければそんなに難しいこたーない
IntelliJ IDEAのJava to Scala機能が不完全なのは、ある程度可読なScalaコードに
変換しようと頑張ってるからであって…。ただ、protected staticとか言語仕様上
等価なコードに変換するのが無理ぽなものは一部にあるといえばある
ただまあ、別の問題として非可読なScalaコード吐いてどうすんのよ、という話はある こんなに簡単にScalaにmigrationできますというデモンストレーションで採用する説得力上げるとか?
単にJavaのままで混在できますのほうがマシだと思う
どんなに優れた自動変換ツールであっても ドキュメントと人がそう簡単には対応できないんじゃ? 逆にそれに対応できるリソースがある会社にツール売っても儲からんだろうよ
COBOLのようにくたびれたオサーンにしか扱えない言語には決してならないと 胸を張って言えるものだけが Intelli J IDEAの変換機能に石を投げよ
>>302 javaのコードで納品するから問題ない
>>303 COBOLとの比較する意味がよくわからないな
IntelliJ IDEAのJava to Scala機能は、人手でJavaから可読なScalalコードに書き換える手間を減らすための
補助ツールであって、変換したものをそのまま保守する前提の機能じゃないよ
COBOL技術者の確保が難しくなって管理されなくなったレガシーコードをどうするかという問題が かつてCOBOL->Javaトランスレータという製品を生んだ歴史的経緯のことを言ってるんじゃないの? どんなに汚い実装だろうとプログラムなんて動けば一緒、という層には売れるんだろうな。 健康食品みたいね
汚いより美しいコードがマシに決まってるだろ プログラマならそう考えるべきじゃないのか
>>307 は?そのレスはどの文脈から出てきたわけ?
こんな優秀な言語がなぜ普及しないのか不思議
既にある種のニッチは抑えてると思うけど、それよりメジャーな路線というかSIerへの普及に行こうとすると 結局Javaがライバルとして立ちはだかるからねえ。おそらく、Javaと同じ程度に普及しようとしたらJava並に なるしかないので、開発が継続されてそれなりに使われれば十分と最近思っている自分
- 意識の高いSIerがいない(統計的観点) - SIerは衰退しました(滅亡論) - そんな業種なかったんや!(UMA説)
313 :
デフォルトの名無しさん :2013/09/06(金) 07:48:48.15
Java8がかなり強化されるから逆に揺り戻しが来ると思う。
Javaは土台が腐っているから無理
315 :
デフォルトの名無しさん :2013/09/06(金) 13:48:25.08
なんでJavaで造ってしまったのだろう
ソースコードを鑑賞するという文化を持たない未開人のせいだ
>>315 あなたたちはJavaAPIやApacheCommonsの魅力を知らない
Java/JVM資産の恩恵要らない分野ならHaskell/OCaml/F#が既にあるじゃん
Javaと連携させる上ではJavaを意識せざるを得ないが 言語自体は言うほどJavaに縛られてないと思うんだが
JavaというよりJVMに縛られてる気がする 末尾再帰なしとか
末尾再帰なしってどゆこと?
一般的な末尾再帰の最適化ができないことを言っているんだと思う たとえば、f と g が相互に呼び出し合っていて相互に再帰的である場合に それを単なるジャンプに書き換えるとか。でも、これ自体は実際には大して 問題にならんけど。
ClojureやJRubyやOCamlJavaのようなのと比べると縛られてるというか 意図的にJavaに寄せてるよね
ClojureはJVMに十分縛られてると思うぞ。自己末尾再帰の変わりに loop/recur使うところとか Javaのメソッドを簡単に呼び出すためのspecial formとか。JRubyとかはgemとかも使えて、Java はあくまでFFI的な感覚だけど。OcamlJavaは使ったことがないのでわからない
末尾再帰最適化なしは、紙に書いたアルゴリズムを何も考えずにそのまま実装すると穴にはまる
相互再帰とか何も考えずに実装できるほど頭良くねーよ
Set#containsの実装がtraitで入り組んでて見つからない
328 :
327 :2013/09/09(月) 09:01:07.97
自己解決した 要素5個以上のSetはデフォルトでimmutable.HashSetが使われるのでHashSet.scala見ればよかった
java だと mac win linux androidに対して汎用性の高いコードを書きやすいと聞きました scalaも同様どうでしょうか?
>>329 OSやマシンの互換性はほとんど無視していい
アンドロイドだけはメモリとかを気にする必要があるかもしれない
それよりも、JVMやJREのバージョンを気にする必要がある
apache commonsとかの外部ライブラリを使ってる場合もjreのバージョンで使えなくなることがあるから要確認
コンパイル時正規表現チェックを導入したいがmacroがまだ枯れてなさそうで躊躇してる
IntelliJさんならコンパイル時チェックどころか編集時チェックですわ
マクロは廃止した方がいいと思うのは私だけでしょうか
自分が理解できないから?
マクロを廃止した方がいい理由 1. コード生成コードだから、抽象度が高く、本質的に難しい(展開されたコードと、そのコードの動作のチェックが必要) 2. 抽象度が高くなるパーツをマクロで表現するためではなく、タイピングが少なくする目的でマクロを使う(マクロ使用のガイドラインの不徹底) 3. 抽象度を無視したマクロ群は、後からまとめるのが困難 4. 外部の人が理解するときは、ごちゃごちゃしたマクロ定義を読む手間が必要 5. とにかくマクロ周りはバグを見つけにくい
339 :
デフォルトの名無しさん :2013/09/14(土) 13:53:56.66
それは廃止した方がいいじゃなくて、(チーム内で)使用しない方がいい じゃないのか?
コードの8割はネットからのコピペという現実
自己紹介乙
普段使いでマクロを使おうとは思わないな。
マクロを容認するとしても、ネットにアップしてOKしてくれるような、マクロの健全さを承認するシステムが欲しい
普段使いが何を指すのか分からんが ライブラリ作者以外は使わんでいいだろう
バカほど使わなくて良い機能を見つけて使いだがる
>>344 アプリケーション書くときとかね。
マクロ使いたいくらいなのだから、何か抽象度の高いことをしたい時以外に出番ないだろうし。
23のタプル
>>338 2, 3, 4., 5.は主にCのプリプロセッサマクロみたいにチームメンバが安易に使う事を危惧してるんだろうけど
Scalaのマクロは今のところ書くのが少々面倒だし、マクロ定義を別のコンパイル単位にしないといけないし
(sbtだとシングルプロジェクトだったのをマルチプロジェクトに分けないといけないということ)で
懸念してるような事態はそんなに起きないと思うよ。ライブラリ/フレームワーク作者が主に使うためにある機能
1.はライブラリ/フレームワーク作者がマクロをちゃんとデバッグしてくれないと困るとは言える
scalaって、仕事で使うとしたらどんな場面で使うのでしょうか? 個人ツール? 適したプロジェクトがある?
352 :
デフォルトの名無しさん :2013/09/15(日) 11:41:34.38
他人に聞いてるうちは無理
>>351 頭の体操
朝や夕方にラジオ体操やる会社あるだろ
あれと同じだよ
val s = 超長い文字列 List(s, s).distinct これ文字列sに比例する計算量かかりますか?
356 :
355 :2013/09/15(日) 15:15:49.29
参照先が同じでも内容の比較までしてしまうのかという質問です
357 :
デフォルトの名無しさん :2013/09/15(日) 17:49:52.57
>>356 apiで上がってるソース見てみたけど、ハッシュの比較して同じなら同じっぽいよ?
まあ、俺が読むより自分で読んだ方が信頼できると思うけど。
質問です。
ScalaのParsersでパース処理がしたいのですが、書き方が分からない部分があります。
普通のテキストの中にxml風のタグ部分が出現するのですが、
その部分をパースする方法がわかりません。
<tagA attr1="1xx" attr2="y2y">123<tagB>zzz</tagB></tagA>
このような感じで、tagAの中の123だけ取得したいです。
tagAの属性とtagBそのものはあったり無かったりなので、目標としては
"<tagA" ~> (anyString ?) ~> numbers <~ (anyString ?) <~ "</tagA>"
みたいな感じでパースしたいのですが、このままだと数値が来る前に
2番目のパーサーが全ての文字列を読みつくしてしまって上手くいきません。
「次の要素がくるまではどんな文字でも読み飛ばす」みたいに書く方法を教えてください。
素直に">"で切ればええんちゃう というかそれ以前にSAXかPullParserでも使った方がいいんじゃ
何一つ頭を使わずに isTagABegin~isNum~isTagAEnd | isTagABegin~isNum~isTagBBegin~isStr~isTagBEnd~isTagAEnd
>>357 ハッシュ関数と同じ長さの文字列の比較はそれぞれ文字列の長さ分の時間かかるから
つまるところ356の言うとおりになるな
ワロタwせめて再帰構造使って差し上げろw
>>360 ならないだろ。
Hash計算は最初の一回だけ。
363 :
デフォルトの名無しさん :2013/09/15(日) 20:05:29.59
みなさん返信ありがとうございます。
>>358 全然フォーマットの違うテキストの中にxmlっぽい構文が出てくるので、
そもそもその構文かどうか自体が"<tagA"が来たらって感じで判断したいんですよ。
「Scala PullParser」で検索してみたんですがxmlっぽいのしか見つかりませんでした。
すみません。
>>359 isTagABeginってどういう感じで定義したらいいでしょうか?
そもそも難しい使い方が分からないので scala.util.parsing.combinator.Parsers しか使えてないのですが、
"<tagA"で始まって ~ 0文字以上の連続があって ~ ">"が出てくるまで
っていうパーサーってどうやって作るんですか?
もしかしたら凄く見当違いな事を言ってるかもしれませんが、
宜しくお願い致します。
あぁすまん356読み落とした インスタンスごとに1回はhashCodeの計算走るからsの長さには比例するけど、同一インスタンスに対するhashCodeはキャッシュされるし 比較はまず参照比較されるな
始めたばっかりだけど、なんかこの言語、類推が通用しにくい気がする これがいけるならこう書けるだろうと適当に書いてみるとエラー連発 他の言語だとここまで気にならなかったんだけどなあ
366 :
デフォルトの名無しさん :2013/09/16(月) 00:32:51.27
マルチパラダイムで、色んな書き方が出来るためじゃない? 使ってればすぐ慣れるよ
マルチパラダイムはやろうと思えばC言語でも実現可能 それを文法レベルで採用したのが成功するかは、まだ分からない 個人的には、教育コストで挫折して、文法仕様でパラダイムを絞り込む方向に行く気がする
>>363 試しにStandardTokenParserで考えてみたけど詰まった
tagに囲まれたtextをマッチさせるためにはStandardTokenParserを拡張しないとダメなのか
そこだけRegexParserをもってきたいけど、造りが違うのでいいとこ取りできないような
-------------
import scala.util.parsing.combinator.syntactical.StandardTokenParsers
object TagParser extends StandardTokenParsers {
lexical.delimiters ++= List("<", "</", ">", "=")
type Tag = Parser[(String, (Seq[(String, String)], Seq[_]))]
def expr = tag.*
def tag: Tag = "<" ~> ident ~ attr.* ~ ">" ~ tag.* ~ "</" ~ ident <~ ">" ^^ {
case name ~ attrs ~ ">" ~ tags ~ "</" ~ end if name == end => name -> (attrs, tags)
}
def attr = ident ~ "=" ~ stringLit ^^ { case name ~ "=" ~ attr => name -> attr }
def parse(s: String) = phrase(expr)(new lexical.Scanner(s))
}
// TagParser.parse("""<tagA attr1="1xx" attr2="y2y">123<tagB>zzz</tagB></tagA>""")
TagParser.parse("""<tagA attr1="1xx" attr2="y2y"><tagB></tagB></tagA>""")
/****
scala> :load Tag.scala
Loading Tag.scala...
import scala.util.parsing.combinator.syntactical.StandardTokenParsers
defined module TagParser
res1: TagParser.ParseResult[List[(String, (Seq[(String, String)], Seq[_]))]] = [1.51] parsed: List((tagA,(List((attr1,1xx), (attr2,y2y)),List((tagB,(List(),List()))))))
***/
Java8でよくない?
よくないにゃ
そうだにゃ
>>369 このスレで劣化Scalaを勧める意味がわからない
8のコレクションやinterfaceの改善とラムダ式だけで十分ってことはないが コンパイル速度、メモリやディスク消費、IDEサポート等で劣化Scalaでもないな
rubyのnokogiriみたいなライブラリありますか?
Scalaはdisk footprintもmemory footprintも気にしてねぇじゃないか
disk footprintはどっこいだろう。scala-library.jarがデカいのはあるにせよ(2.11でかなり分割されるが) memory footprintに関してはscalacはメモリ食いなのは確か。ユーザが作った普通のScalaプログラム がメモリ喰いになるかは作り方しだい
Rubyのnokogiriみたいなのというと、HTMLパースしてスクレイピングしたいとか? Scalaでやるならdispatch + Java用のHTMLパーサライブラリ(のラッパ)使うのが無難かな LiftにはHTML5パーサあるけど単独のモジュールになってないしな…
379 :
375 :2013/09/19(木) 22:55:46.11
ありがとございました
380 :
デフォルトの名無しさん :2013/09/21(土) 18:44:04.95
Scala の Emacs開発環境 ensimeを使えている人はいます?
https://www.dropbox.com/sh/ryd981hq08swyqr/V9o9rDvxkS/ENSIME%20Releases から最新のensime をダウンロード・インストールして、
sbt で、generate ensime して、.ensime ファイルを生成して、
M-x ensime で接続してみたのですが、*inferior-ensime-server* にて、
Starting up Ensime...
Environment:
OS : Mac OS X
Java : Java HotSpot(TM) 64-Bit Server VM 23.25-b01, Java(TM) SE Runtime Environment 1.7.0_25-b15
Scala : version 2.10.0
Ensime : 0.9.8.9
Project waiting for init...
Server listening on 51186..
Wrote port 51186 to /var/folders/85/d7y_wt8n2rl40h74fsl6gcx00000gq/T/ensime_port.1928.
Got connection, creating handler...
Handling RPC: (swank:connection-info)
Writing: (:return (:ok (:pid nil :implementation (:name "ENSIME-ReferenceServer") :version "0.8.6")) 2)
`)' expected but `(' found
Writing: (:reader-error 203 "nil")
となってEmacs側がエラーになります。原因が分かる人はいますでしょうか?
381 :
デフォルトの名無しさん :2013/09/21(土) 22:48:36.12
>>368 ありがとう。結局StandardTokenParserで">"以外の繰り返しを取る事にしました。
もっといい方法があるんだろうなぁ。
いまさらそんな古い話持ってこられても… まあその後、Pollakさん、Typesafeが公式にPlay 2推しした影響か色々あってScalaコミュニティの中心とは 距離置いた感じだけど、なんだかんだで今もLiftにコミットし続けているのであった
2年以上前じゃねえか もう何回貼られてんだろこれ
Scalaが2.7とかだった頃だっけ 懐かしいなw
386 :
デフォルトの名無しさん :2013/09/28(土) 20:47:08.81
頻繁に使用するclassをnewを書くのが面倒くさいという理由だけで case classにするのは間違っていますか? ちなみにそのclassはパターンマッチには全く利用しません
そろそろタイピングが面倒臭いという理由でコーディングスタイルを変更するのはやめにしませんか?
objectにapply書けばいいじゃん
マルチパラダイムって、ようするに、varとvalがあるってだけだよね
戻り値のあるメソッド内で例外をスローしようとしたら、 メソッドの戻り値の型と一致しないというエラーが出る どうせthrowで抜けるから本来は戻り値の型なんて意味ないはずだよね とりあえず(throw e).asInstanceOf[[A]にしてるけど、普通はどうやるの?
>>390 throw で抜けるときは戻り値の型は Nothing になる。
Nothing は型階層の最下位 (もちろん最上位は Any) だから
戻り値の型が一致しないというエラーは普通は出るはずがない。
何か別に変なことしてるんじゃないの?
>>391 必要なのはjava2scalaじゃなくて、scala2javaだと何度言えば…
こいつインテリジェイのより強いん?
Scalazってマニュアルとかチュートリアルみたいなのないのかね eedesi9nのとこは見たんだけど実務的なのが知りたいなあ
>> 397 FP in Scalaは、直接Scalazには関係ないし、Scalazはでてこないぞ。 ただ、Scalazに関係ある概念の説明はあるから、役に立たないこともないけど
Akkaの話題はここでいいのかな? 他に聞くところもなさそうだし
この言語これから伸びるよ
と言われ続けてはや10年
むしろ今が最盛期
地味に一番伸びてる時期が今だと思う。コンパイル速度の問題はあるとはいえ、コミュニティライブラリはそこそこ整ってきたし バイナリ後方互換性の問題への対処、言語仕様の安定化、(色々言われてるけど)Typesafe Stackの整備とか あとは、Sparkみたいな(ほぼ)Pure Scalaで書かれたいわゆるBig Dataを処理するフレームワークの実用とか(国内だとまだSparkはあまり知られてないっぽいが) high throughput, low latencyなシステムのバックエンドのための言語としてはある程度立場を確立できた感じだが、後は「ふつーの」Webプログラミングでどこまで頑張れるか じゃないかねえ。
Spark、ある領域の問題に関して例えばHadoop MRに差し替えて使えるものであって Hadoopのインフラ自体を置き換えるものじゃないからね。 これだけでScalaブレイクかと言われると対象ユーザー数が厳しいかなとw
会社のワークステーションならともかく、自宅のシングルコアのちょっと型落ちのマシンだと詠み込みやコンパイルが遅くてイライラする ちょっと性能を限定してもいいので、REPLでファイルの詠み込み→実行をサクサク回せるようにならないだろうか
デフォルトで入ってるアクターモデルとの関係がよく分からない
scala-actorsは既に本体から分離されてるし、アクター使いたいならAkka使えって話でしょ
ActiveRecordのsave並に簡単に永続化できる何かをください
サードパティーのJavaライブラリを使うのって無理なの?
むりなひとにはむりです
できるということですね?ありがとうございます、がんばります
ナイスポジティブ
eclipseのJavaでの快適感に慣れてたらScalaプラグインけっこう苦痛なんですね・・・ やはりここのみなさんはInteliJを使ってるんでしょうか?
IntelliJは販売代理店の奴がキモいから使いたくない
JetBrainsから直接買えば?
英語サイト苦手なん?
JetBrainsのWebサイトからそのまま買えばいいやん。Ultimate版先にインストールしておいて、 ライセンスキーはWebサイト上からPayPalか直接クレカかどっちか忘れたけどそれで決済すれば ライセンスキーが送付されるので、IntelliJ IDEA起動した後ライセンスキー入力すればいいだけ 今のところというかしばらく以上前から、IntelliJ IDEA + Scala >> Scala IDE for Eclipseな状態 特にIDEAの方は最近、IDEA上からのビルドがsbt(正確にはzinc)ベースになったから直接sbt叩く 場合との不整合が出なくなったし、ユニットテストも簡単に実行できる。補完はimport補完も含めて 大体の場合うまく効く
424 :
デフォルトの名無しさん :2013/10/20(日) 17:34:41.58
空かもしれないListを処理してOptionを返したいのですが、 list match { case lis if lis.isEmpty => None case lis => optionDeriveringFunction(lis) // Option[T]が返る } このような泥臭い処理になります。 あたかもListをOptionのように使えたりしないのでしょうか。 Listが空のときは自動的にNoneを返し、空でない場合は関数を適用してSomeで返してほしいです。 Scalazは勉強中なのですが、モナド変換子を使えばよいのでしょうか?
やってること同じだけど Option(list).filter(_.nonEmpty).map(optionDeriveringFunction(_)) optionDeriveringFunctionはTを返すように変更
// Scala 2.10.3 trait Holds1[A] trait Holds2[A,B] trait Fn[F[_]] object Fn { implicit def fn[F[_]] = new Fn[F] {} implicitly[Fn[Holds1]] // 1: OK new Fn[({ type λ[a] = Holds2[Unit,a]})#λ] {} // 2: OK type Holds2_[a] = Holds2[Unit,a] implicitly[Fn[Holds2_]] // 3: OK // 4: compile error // implicitly[({ type λ[a] = Holds2[Unit,a]})#λ } 4: のケースでエラーがでる(implicitの解決時にF[_]にマッチしない)のはどういうことなんですかね、、
C++だと、テンプレート(ジェネリクスのようなもの)で指定した型に対する操作は かなり自由にできる(コンパイル時にエラーになる)のですが Javaだとジェネリクスの型パラメタであるTに対して 例えば class Foo<T> { public T t; public Foo() { t = 100; //エラー } } とすると型Tがなんであろうとコンパイルエラーになってしまいます (C++であれば、intの100が代入可能な型であればコンパイルOKになります) このような書き方はscalaでは可能なんでしょうか? scalaではJavaのNumberクラスのようなモノがデフォルトで スタックメモリを使うと聞いているので気になっています
>>424 あえてパターンマッチ使うなら
list match {
case _::Nil | Nil => None
case xs => optionDerivingFunction(xs)
}
とかかな。パターンに or(|) が使えるのがポイント。
>>428 そのままの形では無理。Scalaのジェネリクスは機能的にはJavaのジェネリクスと同じような原理で
より強力なだけだから。Javaのジェネリクス設計者の一人でjavac(1.5)の作者な人がScalaの作者だから
というのもあるけど、C++テンプレートみたいなのをJVM言語でやるのは分割コンパイルで激しく問題を生む可能性がある
ちなみに、「高カインド型の値」を定義できるもっと強力な型システムを持つプログラミング言語 もあるけど、そっちの方向に行くと、型で証明を書くことが目的になってたりして、普通のプログラミング 言語としては逆に制約が強くなるので難しいところ。
>>431 レスありがとうございます
いまさら見返して気づいたのですが implicitly[Fn[({ type λ[a] = Holds2[Unit,a]})#λ]] のタイポでした・・・
ところが、修正しても
could not find implicit value for parameter e: Fn[[a]Holds2[Unit,a]]
というエラーが出てしまいます。
Fnはパラメーターを1つだけ取るHK型を取るように宣言しているので、これはマッチしてもいいと思うのですが、、
(そういう意味で 3: の例をあえて書きました。マッチングのルールがimplicit解決時と差異があるように思えたので)
× 3: の例 → 2: の例
>>430 ありがとうございます
んー、やはりジェネリクスの型が消去されてしまうJVM上で動く言語の宿命なのでしょうか
やや面倒ですが、値型を扱うクラスを作る場合はJavaのクラスライブラリのDimensionや、
vecmathライブラリの各種クラスのように、それぞれの値型(int、doubleなど)の種類の
数だけ対応するクラスを作成するべきなんでしょうねぇ
>>435 型消去うんぬんよりコンパイル時のコード生成の有無じゃないか
C++でもテンプレートをDLLやsoでダイナミックロードは出来ないでしょう
>>435 それは違う。Java「言語」は型消去方式を後方互換性、コードサイズの肥大化、分割コンパイルの容易性などの観点から「選んだ」
のであって、JVM言語としてC++ Template的なものを実現するのは難しいことではない。ScalaもJavaライブラリとの
interactionを簡単に行うためにJavaのジェネリクスに合わせてるってのが主な理由。
副作用として、型システムの拡張がよりやりやすくなった。Javaは言語自体の後方互換性の問題から、
raw typeだのなんだの変てこりんな制約を付けざるをえなかったけど(GJの時に既にあった制限)。
ScalaはライブラリレベルでJavaとのinteractionはちゃんとできないといけなかったけど、raw typeとかは 持ち込まずに済んだ。というか、これはGJの教訓がScalaにフィードバックされたと見るべきだろうけど
>>435 後段、それだけなら@specialized使えばいいんじゃ?手でやる必要ないよ
Numeric[T]でもイケそう
scalaからプログラミングを学び始めて、 やっと知り合いに見せることができるようなプログラムが組めたのですが、 コンパイルで一纏めにするというか、手軽に人に渡せてそのまま動く形式にはできないのでしょうか .classがズラーっと出てきて動かすにはターミナルでscala 〜としないといけない状態です
scala jarで検索すると、なんか出てくる
環境にjavaはインストールされてるならsbtでfat jar作るのが手軽かな
たしかに、コンパイルしてclassファイルが250個出てきたときは吹いた
446 :
デフォルトの名無しさん :2013/11/09(土) 01:06:32.04
>>445 sbtは入れとけ。悪いこと言わないから。
これからもう少し大きなプログラム作ろうと思うと、知っておいて損は無い。
sbt-assemblyでおk
>>439 を見て思ったんですが
型パラメータを[@specialized T] とするのと [T <: AnyRef] の違いってあります?
前者は後者を含んでいる。と考えていいのでしょうか?
すみません、AnyRefじゃなくてAnyValです><
>>448 全然別物だよ
[@specialized T] は各値型に特化したクラスを生成する機能
[T <: AnyVal] はTの型を制約している
[T <: AnyVal] にAnyRefを渡すことはできないが、[@specialized T] には何の制約もないのでできる
[@specialized T] にIntを渡せばIntに特化したクラスが使われる
@specializedを何も考えずに使うと.classファイル数が爆発するので注意が必要
trait A[@specialized T, @specialized U, @specialized V] とかコンパイルしてみるといいよ
爆発を避けるには@specializedをつける数を減らすか、@specialized(Int)等で対象を限定する
>>450 なるほど!ありがとうございます
すごく便利そうですが、数値計算クラスを作る場合はNumericを利用した方がよさそうなんですね
>>451 別に片方しか使えない訳じゃないから
必要なら class A[@specialized(Int, Long, Double) T : Numeric] とかやればいーやん?
コレクション扱いまくるプログラム書いてるんだけど、 処理速度を上げる、下げないためにはここに気をつけた方がいいってのがあったら教えてくれ
for式を使えって事?
再帰を使えってことじゃないの
再帰ってパフォーマンス良いの?
再帰はforeach以上にうんこ
話が色々混じってる。まず、コレクションの操作にかかるコストが支配的なプログラムを書いていると仮定して話進める その上でいうと、コレクションのメソッドのforeach/forは、AnyValの値を格納するなら、boxing/unboxingのコストを考慮して多用しない方がいいのは確か specializedについての話があったけど、Scalaの標準コレクションライブラリでは、コードサイズの爆発も考慮してspecializedは限定的な利用になってる だから間違ってはいない…のだけど、特定の状況でしか使えないテクニックになる。重要なのは、ヒープへのメモリ割り当て(new)がどのタイミング で起きるか意識しておくこと(特にboxing/unboxing)
関数を呼ばないようにする工夫ってのは現代的なというかOracle JVMだとそんなに効果的じゃない。クリティカルな程 呼び出し回数が多ければインライン化される可能性が高い。ヒープへのメモリ割り当て(new)もそれ自体は高速なんだけど、多発した 場合GCによる性能低下は避けられないから、こっちを注意する事は意味がある。foreachをどれくらい避けるべきかってのも メモリ割り当て(この場合boxing/unboxing)のコストという観点からみるとすぐわかるわけだし。ある意味JVMがまだそこまで賢く ない(処理系としてはかなり賢いけど)部分を人間が補ってあげるという事になるけど、仕方ない
forの変わりの再帰ってtailrecだろうからバイトコード的には 唯のループになるよね
我々に必要なのは唯のループなんだ!
>>463 そうだね。javapするとわかるけど、メソッドの先頭にgotoするバイトコードが吐き出される
>>466 Scalaのコレクションを多用したプログラミングで細かいチューニングをしたいなら
メモリ割り当てのタイミングを意識するという一般的な原則を理解しとけばだいたい十分という話
多くの細かいテクニックは必要に応じてそこから導出できる
コレクションの性能特性は理解しといた方が良いのは言うまでもない
foreach使うなって話が出てたが、関数型っぽく書くと遅くなっちゃうのか?
>>468 関数型だけでプロトタイプ作って、小さいデータでデモして、OKなら、速度改善
速度改善のときに適切なコレクション選んだり、foreachを別のループにしたりする
場合によってはjavaに置き換え
経験上は、1万超えるループを繰り返すときに foreach を納品版に入れておくとマズい
たった1万?
P6200 2.13GHz (0 to 10000).foreach(i=> (0 to 10).foreach(j=> j+j)) 0ミリ秒 (0 to 100000).foreach(i=> (0 to 10).foreach(j=> j+j)) 16ミリ秒 (0 to 1000000).foreach(i=> (0 to 10).foreach(j=> j+j)) 281ミリ秒 ヤバイと見るか余裕と見るか…
ところで、foreachは副作用前提だから、関数型的な機能じゃなくて手続き型的な機能なのだが…
>>472 実は、scalaはmapも副作用前提なんだ
>>473 全く違う。mapに渡す関数オブジェクトの中で副作用が使えるだけの話。foreachでは副作用を使わないと意味のある事ができない
mapの内部実装の話は、外から使う時に観測できないから別の話だし
Unit を副作用とみるか外界での実行を表現する返り値とみるか…
未だに副作用がないってことがよくわからない 副作用を起こさないでどうやって処理するんだよ
>>476 C言語で言うと、scanf文そのものには副作用があるが、"scanf("%d",&n);"という文字列を出力するyaccコードには副作用がない
>>471 うちのところだとそれだと人命に影響でる
>>478 そんなものにscalaは使わんだろ
…使わないよな?
Scala以前にそんなハードリアルタイム性が必要な場面で普通のJVM自体使えない…よね?
世の中は不条理で満ち溢れている それだけの話なんだよ
1000 x 1000 を走査して 0.3秒はかなりきつい感じ
死人が出てもいいから楽な言語を使いたいです
>>481 javaが出てきた当初は家電含むすべての機械がjavaで動くようになるとか宣伝してたのに…
3 0 億 の デ バ イ ス で 走 る J a v a
実際はPCで動かすのにも一手間必要です
>>485 全てはかなり誇張入ってたにしても、それなりに色々なところでJava 「SEじゃない」Javaは動いてはいるんだろうけどね…
BDプレーヤには全てBlu-ray Disc Javaが入ってるらしいし。でも、ライブラリやら機能がかなり制限された「Java」は同じJavaの
くくりで扱っていいのかどうか
リアルタイム性を必要とする高速な処理はJavaには無理って話から 処理自体動作不可みたいな話になってないかね
>>489 わざわざjavaに切り替えるメリットがあったのか、という話かな
swingでGUI頑張ってるけど泣きそう C#と戯れたい
492 :
デフォルトの名無しさん :2013/11/18(月) 22:37:17.94
ScalaFXにしようぜ
Windowsじゃないなら、C#も不便
あり金全部溶かしそうな名前なのでー
FXで死んだらあり金溶かすだけじゃ済まないけどな
>>22 亀だけど俺が今作ろうとしてるものにソックリ!
>>497 俺は、スレの内容というか、スレごとに画像保存してるわ
>>489 もともとは、Javaって組み込み用途を意識したもので、
Javaアクセラレータ(Jazelle)を内蔵したARMマイコンとか出てたよねえ。
当時のARMは遅かったし、Sunも開発遅いから、勢いに乗る前に、つぶされたって感じだけど。
出てくるのが早すぎたのだろう。腐っていた。
今から出せばまだましになるかも。mRubyみたいなのも出てきているわけだし。
ARMアーキテクチャ上でネイティブJavaバイトコードを実行する Jazelle機能のこともたまには思い出してあげてください
JVMバイトコードネィティブ実行の先見性には当時から懐疑的な意見が多かったような 現状だとJIT,AOTが確立されているし、今後HSAでヘテロ構成コンピューティングの基盤が 出来上がったら、そっち経由で各計算リソース上へ振り分けられた上でネイティブ実行 されるようになるらしいから、今後もなさげだが
val f = future { 長い処理 } f onComplete { case Success(x) => ちょっと長い処理 } Await.ready(f, Duration.Inf) // main終わり これを実行すると、ちょっと長い処理が終わる前にプロセスが終了してしまうようです ウェイトを入れる以外のまともな対処方法を教えてもらえないでしょうか
そのちょっと長い処理が複数の関数を連鎖させてる場合は、はじめのUnitを返す関数しか実行されないとかなんとか
アクターモデルってのに興味を持ってscalaをやり始めようと思ったけど使い勝手とか考え易さとかはどんなもんですかね 反復動作を並列化して少しでも速度を早めたいのですが
アクターはサードのライブラリに任せることになったので標準ライブラリからは廃止予定だ でも特定のループを速くしたいだけならアクターなんて使わなくてもOpenMP的な単純なループ並列化で十分だよ scalaの並列コレクションを使ってもいいけど、parallel forくらいなら自分で作るのも簡単
>>505 ありがとうございます。
調べながらscalaを学んでみます、
>>502 val f1 = future { 長い処理 }
val f2 = f1 andThen { case Success(x) => ちょっと長い処理 }
Await.ready(f2, Duration.Inf)
>>505 ちょっとしたツッコミだが、Akkaは別チームだが結構前からTypesafeで開発(合流)、JonasはTypesafeの共同創業者かつ現CTOだからサードのライブラリというと違和感覚える
間違ってるというほどじゃないが
>>505 parallel for自作は、少しめんどさいような。ナイーブに全要素に対してスレッド割り当てる方法なら簡単だけど、スレッド使いすぎになるし
素直に.par.foreach使うのがいいような気がする
String型の変数の中身がDoubleで表せるものか、それとも普通の文字列なのかを判別する方法ってない?
>>510 超手抜き実装
scala> implicit class StringExtension(self: String) {
| def isConvertibleToDouble: Boolean = try { self.toDouble; true } catch { case e:NumberFormatException => false } }
defined class StringExtension
scala> "100".isConvertibleToDouble
res2: Boolean = true
scala> "hoge".isConvertibleToDouble
res3: Boolean = false
こんな超手抜きはいかが Try(string.toDouble).isSuccess
おお、なるほどな ありがとうございます
import scala.collection.mutable.ArrayBuffer import scala.math.Numeric.IntIsIntegral abstract class Queue[T] { def get(): T; def put(x: T) } class BasicQueue[T] extends Queue[T] { private val buf = new ArrayBuffer[T] def get(): T = buf.remove(0) def put(x: T): Unit = buf += x } trait NM[T] { protected val iv: Numeric[T] } trait Doubling[T] extends BasicQueue[T] with NM[T] { abstract override def put(x: T) { super.put(iv.times(iv.fromInt(2), x)) } } class MyQ extends BasicQueue[Int] with Doubling[Int] { val iv = IntIsIntegral } コップ本のtraitの章のキューをIntからNumeric[T]に一般化しようとしたのだけどうまくいきませんでした MyQを定義する時にNMを使わずにivを自動的に導出させる方法があれば教えてください
>>512 こんなんでどう?
import scala.collection.mutable.ArrayBuffer
import scala.math.Numeric.IntIsIntegral
abstract class Queue[T] { def get(): T; def put(x: T) }
class BasicQueue[T] extends Queue[T] {
private val buf = new ArrayBuffer[T]
def get(): T = buf.remove(0)
def put(x: T): Unit = buf += x
}
trait Doubling[T] extends BasicQueue[T] {
protected val iv: Numeric[T]
abstract override def put(x: T) { super.put(iv.times(iv.fromInt(2), x)) }
}
class MyQ[T](protected implicit val iv: Numeric[T]) extends BasicQueue[T] with Doubling[T]
val x = new MyQ[Int]
x.put(1)
x.put(3)
println(x.get())
println(x.get())
>>515 ありがとうございました
MyQ[Int]()で生成できるようにobject MyQ { def apply[T](implicit iv: Numeric[T]) = new MyQ[T]}を書くと
intelliJのtype aware higlightningが混乱したりする以外はうまく動きました
この場合はclass MyQ[T]のivをpublicにすると大丈夫なようでした
そいえばAkkaの質問ってこのスレでいいの?いろいろ聞きたいこと有るんだけど。
scala版のなら良いよ
初歩的な質問で申し訳ないのですがお願いします。 配列の要素を走査していって条件に当てはまったらそれを返すような動作をしたいのですが 他の言語で使ってきたbreakが使えなくてループから抜けられず困っています。 scalaや関数型言語特有の方法があるのしょうか。
find
ありがとうございます
この言語を業務としてやろうかどうかを悩んでるんだけど安定性とかどう? あと、実際に使ってる人の意見として長所短所を教えていただけないでしょうか
個人用のツールやスクリプトで、実際の仕事で1週間くらい使ってみればいいと思う
525 :
デフォルトの名無しさん :2013/12/01(日) 21:05:31.05
androidに使うのはやめた方が・・・ 利点は簡単に(関数型的に)かけること。 欠点はコンパイル後のクラス数がめちゃくちゃ増えることかなぁ。 コンパイル後のクラスを全て申請書書かなきゃならない現場では使い物にならない。 あとはあれだね、破壊的な操作も簡単に書けるから、 実装する人の間でのレベル差が大きいとどちらも苦労することになるかと。
関数型的に書けるって利点が調べてもいまいちわからないです。 不勉強で申し訳ないのですが、行数が少なくなるってことでいいんですかね
>>526 ・数学的な記述を素直にコードにできる
・変数の中身を考えるときに、実行順序を無視できる
・コードの取り替えが簡単
・テストを、「引数と返り値の対応のチェック」で統一できる
・どの言語で実装しようが、結局は関数型みたいなモノを使うシステムになる
よくScala評で言われる「良い物もあるがゴミも多い」というのはまさにそうだと感じる 同じことするのに色んなやり方がありすぎるし、その中でも「好ましいやり方」というのが 毎年のように変わる
ありがとうございます。 あまりレベルの高い職場じゃないので周りへの教育が大変そうですね… 自分が学んでから考えてみます。すみませんでした
よく検討もせずに標準ライブラリに重要なものブチ込むのは勘弁してほしい
>>528 C++もそうだけど、マルチパラダイムの宿命だなあ
しかも結局、どれが良いか悪いという議論ではなくて
一通りのパラダイムを全部押さえておかないと使いこなせないという
なんとか利点を引き出そうと、オブジェクト指向と関数型プログラミング、うまく混ぜられないんだよなあ 今のところクラスのメソッドの中で関数型記述を使ってるけど、他にやり方があるのかなあ
関数型とよく言われるがせいぜいリスト操作を短く書いてるくらいの意味でしかないのが泣ける
最近勉強始めたんだけど、C++みたいに暗黙キャストできるのすごいですね。 使いこなせるかは別として、記述するのが面白すぎます それと質問なんですが、Scala-IDEなどで作成したプログラムを 手軽に「実行可能jar」 化したい場合は、いったんScala-IDE側でクラスファイル化しておいて Java側(eclipseのJDT)で、それらのクラスファイルとscala-library.jarにパスを通して、 JavaのmainからScalaクラスを実行するjarにエクスポートするのがラクですかね?
assembly-sbt plugin
>>535 やっぱsbtできた方がいいですかね?
正直Gradleとどっち勉強するか悩んでます
maven ササッ
成果物として納品するのがclassファイルで、データサイズが比較的小さいなら、scalaでやる
539 :
デフォルトの名無しさん :2013/12/02(月) 23:44:56.15
関数型の利点はスレッドセーフな処理を簡単に書けることに尽きると思う。 いや、他にも色々あるんだろうけど、実感できるのがこれぐらいなんだよなぁ。 クラウド上とかのいくつスレッドが動くのか分からない環境で作る時に、 この特徴ほど役に立つ物は無いと思う。 逆にシングルスレッド専用ならJavaの方がプログラミングっぽく書けると思う。
それだけならミュータブルなオブジェクトをスレッド跨いで共有しなきゃいい話じゃね それが不便だと言うなら関数型は同様に不便だよ
ScalazでStateモナド+Future使った実装にするのも、AkkaでActor+STM使った実装にするのも自由だ!
>>540 プログラムは大学でC言語を習ってきた他人が書くモノだということを忘れている
「○○しなきゃいい」は、○○することの方がかえって難しい言語があってはじめて成り立つ
>>542 その理屈だと細心の注意を払ってストイックなコーディングをしないと
関数型にならないScalaは失格じゃないですか
>>543 var と scala.collection.mutable の存在を教えなければ解決する
Scalaのプログラミング体験は「使おうとするライブラリが提供する抽象度が適切か」に 大きく左右される、ってばっちゃが言ってた。
2つ質問したいです 1つ目、scalaでlinuxのネットワーク系のサービスデーモンみたいなのを簡単に実装しようと思ったらAkka使えばいいの? 2つ目、googole guiceのような仕組みってScalaにないのでしょうか?googole guiceは記述が冗長でコーディングを複雑化させちゃうけど設計方法としてはメリットあるので採用したいです
僕の○○は純粋強いられ系
クラスAが持つメソッドにクラスAのインスタンスを生成する動作を載せることは可能でしょうか ふと思いついたアイディアに使えそうなのですが一週間近く試せる環境に身を置けないのです 勝手なことで申し訳ないですが教えてください
scalaも盛り上がらないななんか…
550 :
デフォルトの名無しさん :2013/12/05(木) 22:55:34.17
>>548 class A {
def copy: A = new A
}
こういうこと?別に問題無く可能だと思うけど。
いろいろ縁があってscalaデビューも間近、いや、マジか?
>>550 可能ですか。ありがとうございます。
脳内で色々試してみます。
scalaの良いところは何でも簡単にできるところ scalaの悪いところは何でも簡単にできるところ
scalaはWindowsでのGUI開発がどうにかなったら本当に最強 ならないけど
ユーザーからのキーボード入力をString型として読み込みたいのですがどのような方法がありますか?
556 :
デフォルトの名無しさん :2013/12/06(金) 20:38:12.94
読み込んでからString型にするんじゃ駄目なの?
>>556 文字列の読み込みの方法自体がわからないのです
readIntや、readCharがあるのは調べてわかったのですがreadStringはなかったので困っています。
BufferedReaderを使うんだよ Java キーボード 入力 とかでググればサンプルは腐るほど出てくる ググるときのキーワードはScalaじゃなくてJavaな
コアのマニュアルぐらい全部読んでから作業しろ...
ありがとうございます。調べてみます。 すみませんでした
意思決定法の本を読んでて、CDROMの付属ソフトがあったんだけど、本の最後の免責事項のところをよく読んだらscalaで作ってあった 残念ながらコードはなかったが
scalaを業務に使ってる人はどういう風に使ってるの? やっぱりサーバーサイド?
scala使ってる人に質問 Javaじゃいかんのか?
java使ってる人に質問 c#じゃいかんのか?
いかんでしょ
わざわざマイナーな言語を選ぶのは言語仕様以外はデメリットしかないわけで、 メリットとデメリットのどちらが勝るかだな 個人的にはJavaを書く精神的苦痛が大きいからScalaが勝るけど、仮にJava言語がC#相当程度ならScalaは選ばないな
Javaがクソすぎる割に市民権を得ていることがこの世の不幸の5%の原因
だってJavaは何するにしても面倒くさいから・・・ 使っていて楽しい言語の方がやっぱり良いよね。 大きい会社だとそんな理由で選べない!っていうのはもちろん分かるけど。
Javaは様々な分野の開発基盤が揃った、ぶっちゃげインフラ言語だからね。 現代のCOBOLと呼ぶ人も多いけれども、むしろCの立ち位置に近いと思う。 JavaEEはもちろん、SpringとかHadoopとかLuceneとか、Javaで書かれた基盤の上に 育ったソフトウェアスタックがいろいろな分野にある。
570 :
デフォルトの名無しさん :2013/12/08(日) 05:50:39.19
そして相変わらずscalaは無視
>>569 あくまでその上で現代のCOBOLを動かすためのインフラだけどね
scalaをsqalaに改名したら一気に普及するよ
なんか面白い話題ないのかよ
地味においしい言語ですね。
オブジェクトとして定義して使うのと、 クラスとして定義してインスタンス作って使うのでは実行速度に違いはありますか?
577 :
デフォルトの名無しさん :2013/12/10(火) 20:35:22.36
クラスのnewのコストが無視できる状況であるという前提なら、 objectで関数に毎回いちいち多数のパラメータを渡すくらいなら クラスのインスタンスにまとめた方が速いと思われ
ScalaもAparapiでスケールするん?
どう書く?org ってサイト今はどうなってるの?
http://ja.doukaku.org/ GitHubに移行中ですって、GitHubの方みたら、全然移行されてないし。
数多くのScalaコードが有志によって投稿されていたのが、全部消えちゃっているってショック!!
もちろん、Scalaだけでなく、他の言語も多数投稿されていたのに、有志の投稿結果を無にするなんて。
個人のWebサービスなんてそんなもんだろ 当てにしたのが間違ってる
GitHub も危険だと思う俺は異端か…
まぁ、それを言い出したらキリがないわな
Google Codeとかいうのも知らない間になくなったし。 最近でいうと、「日本Scalaユーザーズグループ」というのもいつ消滅するか心配。w いや、もっというと Scala自体 (ry
大して数いないのになんでもかんでも「日本〜ユーザーズグループ」立ち上げるのやめてほしいわ どうせScalaなんて英語避けてたら使いものにならないのに、コミュニティが無駄に分散するだけ
結局、流行らなかったね
世に出るのが遅かった
バックアップとれるサービスなら問題なかと
>>587 1990年代に出ていればねえ。
あと、Javaがオラクルに買収されなかったら。とか。
JavaFXがもっと早くでていれば、とか。
最近Python人気がすごくて、何がなんでもPythonに集約しつつあり、それはそれでうっとおしい。
Pythonは好きじゃないから、Scalaにもっとがんばって欲しいところだが。
こういう無茶苦茶な言語で痛い目を見ると、Pythonのガチガチ仕様も意義があるんだと実感する
Pythonに集約しつつあるってどの分野かな? うちはまだまだJVM言語強い。
>>592 オライリーのプログラムサンプル付きのコンピュータサイエンスの本はほとんどpythonに集約されつつある
Java書くならScala経由でやりたいけどclassがアホのように出てくるのは何とかならんのか
595 :
デフォルトの名無しさん :2013/12/18(水) 16:34:30.07
ならない ちなみにアホみたいにクラスが出てきて困る事ってあるの?
596 :
デフォルトの名無しさん :2013/12/18(水) 19:42:10.50
Javaのプロジェクトはクラスの塊だものねぇ
まあ1学年に100クラスもあったら困る。
でっかい構文糖だもんね
>>595 どの名前のファイルがいくつできるのかが事前の想像を超越してるので、ためして使ってみただけのときに、classファイルを消すときに他の必要なファイルも消してしまう
>>599 ためしに使うときも、Jarで固めちゃうのを癖にすれば?
>>595 Java8に移ればinvokedynamicでSAMと同じ方式で減らせるんじゃね?
Javaの時点で少々のメモリ消費とか起動時間とかは気にしても仕方ないよな サーバー専用なんだから問題にもならんし
あくまでもプロトタイピング用であってサーバ用ではないと思う
Rubyと同様に、趣味言語として作ったはずがドカタが使うようになってしまって 弄りたくても互換性壊したらボロカスに叩かれるから弄りづらくなるコースだな
広まった段階で文法いじれなくなるわけではなく、python3のように新しい方言が出来たぐらいの扱いで使わないだけだとおもう。 scalaの場合はコンパイラのプラグインで、部分選択的に出来る気はするが。
ソーシャル系webサービスの会社では、RESTサーバやバックエンドサービス、Java API作るのに使われてるみたいだけど、 どうもErlang/OTPアプリのJVMクローンをつくりたいという需要があったらしい。 型チェックがあって軽量化されたRailsのJVMクローンってのも、自社サービスの管理画面適当につくる需要を満たせそう。 (Groovyにもあったかもしれない、、、) まとめると、JVM上でひとりでつくるには面倒だったツールが一部作りやすくなって増えてきた。
管理画面をサクサク作るとかならGroovy(Grails)の方がScalaよりは良いのかな? GORMでのマスタメンテナンス系は凄く便利だからな〜 Groovyの場合は動的だから実行時に型に関するエラーが発生する可能性はあるけど、メソッドとかクロージャの引数に型を指定しておけば、 実際の中の処理に入る前に例外が出るからPHPとかみたいに型に関するチェックを自前で書く必要は無い。
表現力がその言語の全てとは言わんが 管理画面作るのが簡単という理由で言語選定するのは近視眼的すぎでは
Hadoop/HBase使ったバックエンドのまさに管理画面の類いを作るのにGrailsを使って いるけど、まあ正解だったかなと言う感じ。 JavaのAPIを直接叩けて他方でView周りは手を抜けるのは確かに楽。 ただGroovyの型検定はメソッド引数はGroovy2.0になってかなり強化されたけれども クロージャーの引数はまだイマイチ。 あと別件でJavaで分散処理フレームワークを開発しているパートナーがあって、先日 話を聞いたところ次期リリースではワークフローを記述するDSLとしてScalaを使うと 言う話だった。もちろんSparkはすごく意識しているらしい。
管理画面作るのが簡単という理由で言語選定するのが近視眼って 目的に合わせて言語を変えるのは至極真っ当だと思うが
配列に格納されている個数が不明の要素を出来る限り同じ個数になるように10分割して、 分割したものを10個の配列などにそれぞれ格納していきたいのですがどうにかscalaっぽく綺麗に書けないですか? 170個の要素があれば、17個の塊を10つ 175個の要素があれば、18個の塊を9つ、13個の塊を1つ のようにしたいんです
175この場合は18個の塊が5つ、17個の塊が5つじゃダメなのかな。
>>612 極端に要素の数が変わらなければ大丈夫です。
ただ、この175は場合によっては179になったり、場合によっては2万、3万になったりします。
後付けで申し訳ないですが、並列コレクションなどで高速化出来ると凄いありがたいです。
最初の塊は1配列の先頭から数えて1個目から18個目、次の要素は19個目から36個目・・・ と元の配列の並びの区間で分割する必要があるのか、あるいは元の配列内での順番は どうでも良く、単に18個、18個と塊に要素を埋めていけば良いのか。
>>614 10分割出来れば元の順序は気にしません
バラバラになってもいいです
ばらした後何をやるのか書いたほうがいいんじゃねーの? 分割数も10以外に変えていいのか?
分割数は10が絶対です。 バラしたあとにどうするってのは上手く言えないです。どういう情報が必要ですか。
m個目の塊のn個目の要素にアクセスするのには元の配列内でn*10+m番目の要素にアクセスすれば良い。
こんな感じ? def partition[A](x: List[A], N: Int): Iterator[List[A]] = { val len = x.length val n = len / N val r = len % N val prefix = r * (n + 1) x.take(prefix).grouped(n + 1) ++ x.drop(prefix).grouped(n) } Range(10, 100) foreach { n => println(partition(Range(0, n).toList, 10).map(_.length).toList) } x が短いときは考えてない。
>>619 上手く動きました
本当にありがとうございます
List の長さが N (今回は 10) の倍数になるように
無害のダミー要素を追加しておいてから、
x.grouped(x.length / N)
とするチートもあります(ダミー要素が許容できれば)。
この方法なら List でなく Array or Vector にして
>>618 さんの方法で
並列アクセスも簡単でしょう。
↑ ああでもこれでは均等にはならないか...
別解 行列の転置みたいなのを使う方法。 リストをN個ずつに分けたリストのリストを「転置」すればいい。 転置: 要素のリストの n 番目のものだけ集めたリストのリスト。 まあ zip のようなもの。 def transpose[A](matrix: List[List[A]]): List[List[A]] = { @scala.annotation.tailrec def r(m: List[List[A]], a: List[List[A]]): List[List[A]] = { m.filter(_.nonEmpty) match { case Nil => a case x => r(x.map(_.tail), a :+ x.map(_.head)) } } r(matrix, List.empty[List[A]]) } def partition[A](x: List[A], N: Int): List[List[A]] = { transpose(x.grouped(N).toList) }
最近になって好奇心でやり始めたけど書きやすいなこれ ライブラリ全然ないじゃんと思ってたらJavaから引っ張ってこれたし なんで流行らないの
Pythonこそが唯一無二の最強言語だから
流行ってる方だと思うんだけどなあ
浸透度は当たり前だがCとかJavaとかとは比べ物にならないし、Ruby、Python辺りにも負けてる わけのわからない有象無象には確かに勝ってる
アクターモデルおいしいお
出てきた時期を考えたら健闘してる方だろ
正式版で安易にいろいろ実験するもんだから後発の割に無茶苦茶散らかってて それが敬遠される大きな理由になってる マルチパラダイムに甘えてないで一回全部リセットして必要な物だけ残して綺麗にするべき
experimentalな機能のこと言ってるんだったらそれで敬遠とかバカじゃねーの?と思うがどうか SIPのリスト眺めても最近採用されたのは今使いまくってるしSIP-18以外必要だから残してくれ xml(リテラル含む)とパーサーコンビネータは次で標準から分離されるな
それを馬鹿で済ませられるならどんなに幸せか…
>>630 んなことしたら、現在Scala採用してる海外有名Web系企業(Twitter, Foursquare, LinkedIn, Klout, ...)はブチ切れるだろうし、Web系以外のところはさらに悲惨になる
そもそも、Scalaは海外では、実用方面でそこそこバッシングが来るくらいまで成長してるのに(どの程度正しいかは別として、「使われてる」事の指標になってる)
そんな理由で敬遠する企業のためにリセットしないだろ。というか、実験的な機能をそのまま「正式に」取り込まないためにSIP-18 - Modularizing Language Features
があるわけで。まあ、標準ライブラリに「研究室」言語だった頃の名残は確かにあって、2.11以降そういう部分は削除か別jarに分離されていく
あと、2.11の動きみてるとわかるが、言語機能の大幅な追加は当面はない(experimentalなマクロの安定化はやってるけど)。2.12はまだ先だけど、限定継続 コンパイラプラグインが標準添付からはずされる予定だし、Scala言語と処理系は当面、安定化路線で行くだろう。実験的なことしたい人はマクロ使って書けばいいので (実際、最近はそうなってる)言語機能そのものを拡張する必要性がだいぶ薄れてるが
>>632 それを幸せと感じるなら転職でもしたら?
>>624 ・REPLに記述するときと、コンパイラ言語として構造上読みやすく記述するときで、コードを変えなければならないから(コンパイルが通ったコードをそのままREPLで確認できない)
・複数のファイルがあるときに、REPLがめんどいから
・とにかくコンパイルが遅いから
??? 1,2行目ちょっとよく分からないんで具体例挙げて
>>637 class Test(val s:Int)
{
}
はコンパイルできるけど、replで読むとコケる
class Test(val s:Int) {
}
としなくてはならない
replでは、クラスの定義は使うコードよりも前に定義が書いてないとコケる
コンパイルの場合はそこまでシビアじゃない
replで複数のコードを読み込んでテストするときには、一つのファイルを更新するたびに、いちいち全部のファイルを順番通りに読み込みなおす必要がある(しかも遅い)
sbt consoleでいいじゃん
>>638 >>636 どちらも、
最近のLL言語がかかえる問題だね。
改行を構文区切りとして認めると、 記述時に ; を書かなくて良い反面、
構文区切りじゃないところで、構文を区切ってしまうという欠点がある。
このせいで、
> class Test(val s:Int) {
> }
みたいに、構文スタイルに制限をつける必要がある。
こんなことなら、最初から、Pythonみたいに、字下げも構文に含めてしまって、
コーディングスタイルガチガチに固めてしまって不自由言語として再出発しても良いかもね。
ただ、これらを、Scalaが流行らないことの理由として挙げる>636 はただのヒレクレ者。
>>636 コンパイル通ったコードをそのままREPLにコピペしたけりゃ:pasteコマンド使えばいいだろ
実行環境的にC++代替やJavaScript代替はまず不可能で Javaや.net、Perl、PHPの置き換えってあたりで一定以上は流行らんだろ しかもJavaや.netやPHP使ってる層の過半数はこの手の言語やらないだろうし
Scalaを説明しようとすると、まずJVMから説明しなければいけないからなあ。 そういう意味で、 >642 の逆で、 今、Java , .net ,PHP 使っている人にとっては、Scalaは敷居低いと思う。 JavaFX がうまく流行すれば、デスクトップ系の開発やっている人にもアピール度が高いのだが。
そこそこ受け入れられたのは敵がJavaだったからでしょ スクリプトならPythonやRuby、デスクトップならC#という超優秀な敵が相手だからなあ
そもそもscalaをスクリプトで使ってる人いるのだろうか… 事務処理系の雑用スクリプトとしてはストレス溜まるし、scalaの納品物で見たことがあるのはjarだけだし
サーバーサイドとしてしかマトモに使えないよね デスクトップ用にGUI付きのを開発するなら各OSにもっと簡単に出来るのがある
そもそもGUI目的ならJavaそのものが死んでいる。
やはりC#こそが最強
C#はPython系だよな 理論や一貫性よりもユースケースを重視するタイプ
たまには F# のことも思い出してあげて下さい
>645 オレはスクリプトとして使っているよ。 普段あんまりしないことをするときには静的言語の方が 早くライブラリを使えるようになるから。 それと、数年ぶりに昔作ったスクリプトを動かしてもトラブルが少ないのがいい。
そもそもjavaに互換性がないしな… 3年前のclassファイル動かないぞ
昔のjavaで今のclassは動かないけど、今のjavaで昔のclassは動くだろ
>>653 APIがコロコロ変わったり、非推奨が消えたりしてるから動かない
だから納品するときはJREも添付してる
655 :
デフォルトの名無しさん :2013/12/22(日) 17:58:02.87
javaでDeprecatedなものが削除された事なんてよくあったっけ?
>>654 外部ライブラリじゃなくてJREでそこまで変わってるか?
メジャーバージョンアップごとに非互換ちまちまはあるが
未だに1.0の頃のクソAPI残ってるくらいのレベルの変更を
コロコロ変わると言う人は初めて見た
>>655 非推奨関数は残っているけど関数の中身が空になってることはある。
JREの変更で困った具体例を知りたいところ。
Java6が出てから7も経つんだな。 Javaの互換性が気になるのはここ数年は無いかなぁ。 最悪、複数バージョンのJRE入れればいいし。 Scalaの変更も落ち着いたし、今は良い時期だと思うよ。 Pythonは昔は好きだったんだけど、 アップデートでライブラリが動かなくなるのはザラだし エンコード関係のトラブルもしばしば。 あと、エコシステムがつぎはぎで不完全なのがきつい。 最近はPython3000(笑)だし Scalaが出た以上は使い処が無くなった感じ
もう大体Python3への移行は終わった とはいえ、Scalaと競合する感じでもない
> もう大体Python3への移行は終わった そうなのか、でももうPython環境維持するコスト払いたくないから Scalaでいいや。 scala.sys.processが優秀だから当面は雑スクリプトはScalaで済ませるよ。
>>647 > そもそもGUI目的ならJavaそのものが死んでいる。
まあまあ。
以外と、JavaFXっていけてるよ。
触れてみると意外にも良いから、流行しそうな予感。
これが、4,5年前に出ていれば。
業務クライアントならWindowsやOfficeとの緊密な連携ができないと意味がない Webでいいやってなっちゃうからな
ScalaFXって一時期死んでいた気がするけど、今はどう? >これが、4,5年前に出ていれば。 WPFもそうなんだけど、今更感が強すぎる。 結局クライアントが重くていいならWEB、 軽さが必要ならC++で書くほか無いからね。
>>653 コード片生成してサーバで動的コンパイルするタイプのやつは完全に死ぬ
30分でプロトタイプ作って、最悪の場合はプロトタイプの雑なコードをコンパイルして穴埋めして納品する という使い方ならpythonでもC++でもなくscalaではないかと
AWTが死んでてSwingがメンテモードで新機能対応止まってるから 枯れてなくてもFX行くしかないのがな
javaのGUIで必要なのは新機能ではなく既存機能の高速化
JavaFXの仮想敵はVCや.NetではなくQtだと思う。
ジェネレータはストリームかも(遅延評価)
QtはQMLで迷走しているのがちょっと。 商用ライセンスがゲロのように高額なのも 確かによくできたライブラリではあるんだけど。
これってListにラムダ関数押し込めるんじゃダメなの?
Javaクライアントはまだ業務特化なら需要はあるのにな 何十年間も現実から目を逸らしてクロスプラットフォームなんて幻想に拘り続けたからこうなった
>>673 条件分岐はどうするんだよ
C#のイテレータやPythonのジェネレータは完全なステートマシンを自然なコードで書けるの
それを自然じゃないコードで書くアプローチがscala-machinesやhano
ゴミですな
関数型的じゃないし実装が非常に面倒だから嫌なんだろうけど ステートフルな部分を簡単にストリームに押し込んでしまえるから 総合的に考えれば、より関数型に近いコードを書くのに役立つ機能だと思うわ
こういう、Haskell的なアプローチは なんでもオブジェクト指向で解決時代の迷走を思い出させる。 ステートは普通にオブジェクト指向的に実装して、 関数型的な部分と独立させるのが好みだわ。
限りなく純粋だったあの頃が忘れられずに ScalazでStateモナドつかってコード書く人もいるんですよ!
Array("aaa-bbb.txt", "ccc-ddd.txt", "eee-fff.txt") から Array("aa", "dd", "gg") を関数型的に作成するには、どんなコードを書けば良いでしょうか?
684 :
683 :2013/12/28(土) 11:07:17.19
欲しいのは"aaa", "ccc", "eee"を含むコレクションです Array以外でも構いません、間違てすみません
685 :
デフォルトの名無しさん :2013/12/28(土) 11:18:29.06
>>684 Array("aaa-bbb.txt", "ccc-ddd.txt", "eee-fff.txt").map(_.substring(0, 3))
Array("aaa-bbb.txt", "ccc-ddd.txt", "eee-fff.txt").map(_.split('-').head)
687 :
683 :2013/12/28(土) 11:27:05.26
Scalaでspecializedアノテーションを使って作成したクラスを Javaから使用することはできるのでしょうか? また、できる場合はクラス名とかメソッド名に$などが付いたものを 直接指定したりするのでしょうか?
scalaのmacrosについて勉強を始めるとしたらどのバージョンからが良いんだろう
HEAD + macro paradise
不変クラスって限界があると思うんだけど線引きの目安とかってあるん?
ビルダクラスなんかは無理に不変にすると無駄に複雑になるだけだからやめたほうがいいかも クラス自体がいくら不変でもクラスの外から見たら不変ではない場合もあるな DB使ってたりとか
あとは性能面だな 1億要素のコレクションを毎回コピーするのは無理があるし 1億個のインスタンスを作って捨てるのも無理がある Listを受け取ってListを返す関数でも内部では一旦配列に変換して 処理するようなことはよくある
scalaってC++に組み込むluaみたいに使える?
無理 ガチガチの静的言語だから融通利かないしコンパイルも起動もクソ遅いし 何よりわざわざホストを別の言語で書く意味が無い
C++のプログラムにJVM組み込んでScala動かすこと自体はできる すでにC++とScalaの資産が山ほどあるって状況じゃない限り 695のように旨みはほとんどない
旨みは必要ない そこに山があるから登るだけ
アルピニストのお方だったか
最近分散処理とかでよく聞くけどAkkaフレームワークの処理能力ってどんなもんなん?Javaのスレッドより速い?
処理能力よりも記述の容易さを評価したい
>>699 速くないけど考えるのが楽で安全
もしミスなく大して変わらない時間でマルチスレッドで書けるならそっちのほうがいい
AkkaはErlang相等のスレッドプールとノンブロッキングなメッセージ通信、 ノード障害対応などに重点を置いたフレームワーク。 単一マシン上のスレッドで対処できなくなっても、コードそのままで 複数ノード方向へスケールできるのがAkkaのコンセプトであることから Javaのスレッドと性能差を比較するのはあまり意味が無いといえるよね
Futureとアクターの有効な使い道がいまいちわからん コードはいらんから考え方だけでもだれか具体的に教えてくれ スレッドでやることとの違いもあれば嬉しい
使い道というか、相互通信の組合わせ数などで見た並列処理の複雑性や、 将来発生する(かもしれない)リソース排他バグ、性能問題等に対して どれくらいコストを掛けれるかでそれぞれ適用範囲が異なる。 自分がScalaアクターを使う場合のポイントは - Scalaは関数を第一級オブジェクトとして扱える - 関数型の参照透過性は、並列処理においてしばしば再現が難しいバグを引き起こす想定外の副次的な悪影響を避けることができる - 並列処理部分を引数から結果を求めて返す純粋な関数にブラッシュアップし、Futureやアクターに実際の計算をさせる - Futureやアクターへの非同期メッセージは、仕事を依頼しておいて結果が出るまで他の処理ができる - 複雑なやりとりなら並列コレクションでべた書きするより、役割としてコードに明記したい - Akkaアクターなら負荷が増大してもノード増やして対処可能 - Typesafe謹製のツールが使える - あと、Scala命名の由来が「スケーラブル」だってのにわざわざ低レベルのスレッド&排他処理でガシガシ書くのはなんだかなーって気持ちの問題
でかい処理でコア使い切るのが目的なら、アクタ使うよりも なるべく外側のループを並列実行するのが確実安全高速 安易にアクター使わないで、まずはもっと確実な予測しやすい方法でシンプルにやれないか検討した方がいいよ
外側のループを並列実行ってどういうことですか?
>>707 Scalaと関係ない話だが
お前のHDDにある大量のエロ画像全部に対してぼかし処理(自分と周囲の画素の平均が結果の色になる)をかけたいとする
この処理は処理対象の各画素について独立なので、並列化の最小単位は画素になる
並列化するとしたら、「x方向の繰り返し」「y方向の繰り返し」「各画像ファイルに対する繰り返し」のどれかになるだろうな
この場合、汎用性を考慮しないなら「各画像ファイルに対する繰り返し」を並列化するのが正解だ
一般に、並列化はなるべく大きな単位で行うのが望ましい
その方が並列化できる部分が増えるし、スケジューリングやら同期化やら通信やらのコストも小さくなるし、プログラミングも容易だからな
Scalaのレベルでいわゆるparallel forってサポートしてたっけ?
ParSeq
>>708 その構成だと結局File IOがボトルネックになる問題だし
最初からそれ以上スケールしないという前提の問題なのだとして例を挙げたのなら
そもそもアクターを採用する必要の無い例題を挙げているわけでScalaと関係ないどころか
話の流れにすら関わっていないと思う
>711 横だけど、 アクターが必要なケースはリモートサービスで粒度の細かいリクエストが 数万単位で降ってくる場合以外はまずないわけで 708は、アクターは過半数のプログラマには必要の無い機能だと言いたいんじゃないの?
アクターは並列というか非同期処理だよな バカでかい処理の並列化なんてもしあってもだいたいデータ並列だから並列コレクションで足りてしまう
結局、並列コレクションがあればアクターは使い道がほとんどないってことなの?有用なのはどういうときなんだよ
問題領域を限定しないまま適用範囲が異なるツールを比較することになんの意味があるんだ? 道具を使うために問題があるんじゃないんだよ、本末転倒だってことにいい加減気づけよ
元のスレッドをブロックしたくないとき
> 結局、並列コレクションがあればアクターは使い道がほとんどないってことなの?有用なのはどういうときなんだよ HDDのエロ画像のように処理開始時点でやるべきことが全部わかっているときは 並列コレクションの方がよい どんどんエロ画像がウプされるサーバだと、 エロ画像がウプされる度に(非同期的に)処理をするから 並列コレクションが使えない。 こういうときにはアクター。 艦これのゲームサーバなんかはアクターに向いている。 つまり、java.NIO2を使うような局面ね。
>>717 並列コレクションは使えないけどFuture系のなら使えるよね
使ったことないけどアクターは仕事の違う人間による流れ作業みたいな感じなんじゃないの 自分の担当することをやって次の人に仕事の続きを任せるみたいな
>718 Futureは後で計算結果を回収するために機構だから、 エロ画像をフィルタした後データベースに書き込むのは 投げっぱなしジャーマンでかまわないから Futureは不要。
722 :
717 :2014/01/04(土) 17:23:44.23
なんかのネットワークとか木構造みたいなのでノード一つ一つをアクターにすればいいんじゃないの(適当)
そもそもマルチスレッドでもどこが早くできるのかよくわからんし
アクターもスレッドも、ともに並行性(Concurrency)を扱うためのメカニズム 並列コレクションは名前の通り、並列性(Parallelism)を扱うためのメカニズム 並行性と並列性の意味はぐぐればでてくるので省略 もちろん、アクターもスレッドも複数のCPUが割り当てられる限り、処理の並列度を高めるのに使えるが 並列コレクションは逆に並行性を(通常は)取り扱えないというか取り扱うのに使ってはいけないという 根本的な違いは理解しておいた方がいい
将来もずーっと、単一ノードのマシン構成で計算可能な問題ですよーという 設計書でクライアントが納得するんなら好きな実装で書けばいいけど そんなクライアントでも、「急な負荷増大で処理能力追いつきませんでしたー(アハハー)」 なんて言い訳はまず許されないからな。
アクターは割と安全で簡単に作れるんだから小物なら実装してみて早くなればそのまま使えばええねん 大抵早くなる
Akkaは導入コストの安さとメンテナンスへの備えバランスが魅力 最初から象を相手にできる富豪ハンターばかりじゃないんだし
この流れに便乗してひとつお尋ねしたいのですが、 マルチスレッドに対するアクターの利点を同僚に説明しないといけなくなりました。 しかし、自分の並行(並列?)プログラミングへの入り口がScalaのアクターでそれ以外を勉強しなかったため、 いまいちマルチスレッディングの面倒臭さや怖さがわかりません。 よろしければ教えてください。
- 複数リソースに対するロック取得順序を間違うとデッドロック - 必要なロックの取得を忘れていたら処理結果が破綻 - ロックの開放が抜けていたらデッドロック - ロック範囲が不適切に長いと性能低下を引き起こす - スレッド間のメッセージ通信はセマフォやメッセージキューなどのスレッドセーフな仕組みで適切に実装されていなければならない - バグの再現が困難
マルチスレッドだと複数人で材料をこねくり回すように、データを弄っていく この複数人間で上手くやり取り出来ていれば早いんだが少しミスるとわけのわからないものになる アクターだと自分の担当部分をしたら次の担当にそれを渡していくってのを繰り返していくイメージ。アクターはメッセージを受け取った順序はどうでもいいとしてるけど、Scalaのはキューでメッセージを受けるから順番も再現されるのかな 間違ってるかもしれんが例えるとこんな感じ
マルチコアCPUになってきて並列並行の処理が使えた方がいいって流れで大衆的なものが必要になったのかな マルチスレッドは使いやすいとはとても言えない アクターや並列コレクションは適当でいいから楽
良いところはバカでも簡単に使えて、よほど使い所を間違えない限り早くなることが多いってところかな マルチスレッドで考えられるならそっちの方が絶対にいい
> マルチコアCPUになってきて並列並行の処理が使えた方がいいって流れで大衆的なものが必要になったのかな ちがう、プロセッサの細密化に限界が来てムーアの法則にタダ乗りできていた 今までとは別のソリューションが必要になったということ。 すなわち、これからはソフトウェア側でも頑張って並列処理を書いてねというパラダイムシフト
ScalaのActorはそんなご大層なもんじゃ無くて ネットワークIOの多いアプリで 問い合わせごとにActorを生成して ActorがDBにトランザクション発行してクライアントにレスポンスするって 流れにするんで良いんじゃ無いかな。 Actorの長所は ActorSystemがメッセージキューも兼ねるから、 実スレッド数を気にしないでポンポンActorを作成しても問題ないって ことだと思う。 Actor同士の通信とかは、使う機会あんまり無いと思うよ。 それと万が一パフォーマンスが厳しくなったら 複数マシンに分散しやすいと DBにsqlite使うも、Spark使うもその辺は御勝手に
> マルチコアCPUになってきて並列並行の処理が使えた方がいいって流れで大衆的なものが必要になったのかな アプリを速くしたいだけなら まずはC++に書き直したり、余計な中間レイヤーを抜き、データをオンメモリで持つ方向が良い。 POCO C++とかboost::asioとか使いやすいライブラリ増えてきているし さっきのエロ画像処理なんかはSIMDも使って相当速く書ける。 Actorは逆にプロセッサがシングルコアでもお手軽にノンブロッキングIOが使えるようにするためのものだと思う。
>>737 >アプリを速くしたいだけなら
>まずはC++に書き直したり、
これを言っていいのか
書きやすいからscalaを使うんだろうし、その中で速さを求めるならアクターも考慮に入れるべきだろう
並列コレクションと同じでリスクがほとんどなく使えば少し速くなるってことで良いと思うんだけどねえ akkaのはまた話が違うのかもしれんが
scalaにくっついてるアクターについてはオライリーもコップ本もそんな風にしか触れてなかった
akkaが代わりになるからそうなるんだろうけど、 アクターを入れた元々の理由はなんなんだろうか
オリジナルアクターとAkkaアクターの違いが理解できないクラスタ
akkaのは違うコンピュータやサーバー同士で遠隔地で連携できるんじゃないのたぶん
イミュータブルで状態を持たないでやろうっていうscalaの方針に、マルチスレッドよりアクターのがしっくり来たんじゃね?
Scalaアクターのメンテナ Philipp Hallerさんのサイト
(
http://lampwww.epfl.ch/~phaller/actors.html )にOdersky先生との共著論文があってー
Scalaアクターの基礎と方向性はこれで固められていてー
AkkaはJavaもサポートするフレームワークとして開発されていたのをTypesafeに吸収されてー
Philipp HallerさんもTypesafeのコンサルタントでー
Scalaアクター→Akkaアクター移行ツールも用意されていてー
違い気にする必要あるんか?
みんながみんな違うことを言ってる 結論はなんなんですか
最近はOSとコンパイラがなんとかしてくれるから放っとけばええねん
本当に知りたいならツイッターとかで捨て垢で偉い人を質問攻めにしたればええねん
マサカリ飛んでくるような挑発ワードを適当に散りばめておくのがコツやで
おまえら... ちゃんとScala日本ユーザーグループに本アカウントで礼儀正しく質問しろや
どこを見てもマルチスレッドより安全です!しか書いてない
日本のscalaユーザは口だけの無能ということやね
>>751 例えばどんなワードや
Scalaは所詮オモチャ、とかそんな感じか
Clojure >>>>> 越えられない壁 >>>>> Scala
>>756 Clojureは圧倒的なクリーンさが魅力だよな
Scalaみたいな魔窟にはならないでほしいわ
なんでこんなに複雑怪奇な言語になっちゃったんだろう C++を軽く超えてるよね
>758 C++と違ってpitfallはほとんど無いからそれは感じないかな。 複雑なのの半分はシンタックスシュガーだしね。 海外勢のscala論者がどんどんclojureに乗り換えて行っているのは気になる。
>>732 佐藤先生の日記は興味深いこともあるのだけど、アクターモデルという言葉だけから
ErlangやScala Akkaなどのアクター(佐藤先生はこれらについては、個別にどれだけ調査されたか若干微妙に思える)が
昔のアクターモデルと同じようなものという感想を持たれている節があるからその辺は割引いて考えた方がいいかも。
>>759 どっちかというと、ホビーでScalaやってた層が、(次の流行を狙って?)Clojureに手を出してる傾向が強いように見える
(dppは最近Clojure推しだけど、Play 2推しの裏でLiftがハブられたという政治的事情もあるし)
Clojureの人気が伸びてるのはClojure関係なしに使えるStormが出てきたのが大きい。一方ScalaはSparkの人気が
急速に高まっていて(正確にいうと、SparkコミュニティはScala製だからというより、機械学習等の特定用途でHadoopより性能が
出るから)、Spark Summit(有料イベント)で400名超埋まってたりする
>>758 Scalazみたいな(元来は特殊であった)ライブラリ使わなければそうそう怪しげな挙動にひっかかることはないと思う
implicit parameterの解決方法は実際のところ複雑ではあるんだけど。Scalaはコアの部分はかなりちゃんとしてるんだけど
それとシンタックスシュガー(どこまでをシンタックスシュガーを呼ぶかは考える必要が有るけど)を混同しがちなので、複雑怪奇にみえるという側面はあると思う
Sparkの使い方とかを日本語で書いてくれてる本とかサイトとかないですかね やっぱり英語のドキュメントを読むしかない?
今月号の日経ソフトウェア、Scalaの紹介の特集記事があるぞ。 日経ソフトウェアって、近所の全ての本屋で、発売から2週間以内に売り切れる。
立ち読みしたけど大したこと書いてなかった
766 :
デフォルトの名無しさん :2014/01/05(日) 17:04:17.29
Sparkって何するもの?
clojureもrubyと同じように、関数の入り口で壮大なスイッチ文になるのだろうか
マルチメソッドか、失礼
Sparkがビックデータを使って何かをするのは知ってるし興味はあるけど、 どうやって扱うのか、そもそも何なのかもわからない
ドキュメント読めよwww
理解するだけじゃなく、翻訳も同時にしないといけないとか面倒だから誰か翻訳しろ
Apache Spark is an open source cluster computing system that aims to make data analytics fast ― both fast to run and fast to write. アパッチ スパークはオープンソースのクラスターコンピューティングシステムです。データ解析を高速に行うこと(高速に動く、高速に書き込む)を目標としています。
To run programs faster, Spark offers a general execution model that can optimize arbitrary operator graphs, and supports in-memory computing, which lets it query data faster than disk-based engines like Hadoop. プログラムをより高速に動かすため、スパークは任意のオペレータグラフ(よくわからん)を最適化し、 Hadoopのようなディスクベースのエンジンよりも高速にデータをクエリできるインメモリコンピューティングをサポートする 一般的実行モデルを提供します。
To make programming faster, Spark provides clean, concise APIs in Scala, Java and Python. You can also use Spark interactively from the Scala and Python shells to rapidly query big datasets. プログラミングをさっさと終わらせるために、スパークは綺麗で簡潔なScala、Java、そしてPythonのAPIを約束します。 A calaとPythonのシェルで対話的にスパークを使うことで早くビッグデータセットをクエリできます。 なるほどわからん
見事にbuzz wordsが並んでいるだけで内容0の説明だな。 かくいう俺も、原文見に行ったけどなんなのか理解できなかった。
要するに高速で高速で高速だからスパークなんですってことだろ
faster使いすぎだろ バカにしてんのか
他のところ見てきたけどバカみたいな量のデータから語句を探してきたりするのに、メモリにデータを展開してから並列処理でやれば早いんじゃね?ってことだった 実体がどうなってるかは使う気ないのでわかりません
BIGDATA持っていないとまったく意味が無さそうだな
しかも日本だと持ってる企業はScalaなんて使わないだろうし
HadoopはディスクI/Oを並列化することで、大規模データを実用的な時間で処理するためのフレームワークだけど、
毎回「ディスク読み込み→処理→ディスク書き込み」ってやるので、機械学習みたいな「同じデータセットを繰り返し
処理する」ようなタスクには不向き。
Sparkは、全データをオンメモリに展開するので繰り返し処理に向いてる。開発者達は「次世代Hadoop」っていう売り
込み方をしていて、実際に次のバージョンのCDHではSparkがサポートされるので、これから流行る可能性はかなり
高いと思う。
書き方は、Scalaのコレクション操作と同じやり方で書けるので直感的(SQLの文法で書けるようにするSharkってプロ
ジェクトもある)。
file = spark.textFile("hdfs://...")
file.flatMap(line => line.split(" "))
.map(word => (word, 1))
.reduceByKey(_ + _)
あと、Hadoopは基本的にバッチ処理だけだけど、Sparkはストリーム処理 (Spark Streaming)や、Scala REPL上での
対話型処理なんかもサポートしてる。
先日、Spark Summitっていう初の大型カンファレンスがあって、かなり人が集まったみたい。発表資料を見ると分かる
けど、Yahooがすごく熱心にコミットしてるし、IntelやAdobe、RedHatみたいな有名どころも発表者に名を連ねてる。
http://spark-summit.org/summit-2013/ 日本語訳を待つのもいいけど、たぶん向こう一年くらいはまとまった日本語文献は出てこないだろうから、この発表
資料を辞書を引き引き読んでみるのもいいんじゃないかな。
とりあえず試してみたい人には、スタンドアロンモードで動かしてみるという手もあるよ。
http://spark.incubator.apache.org/docs/latest/spark-standalone.html
sqliteすら使い切ったこと無いからパスするわ
Sparkのおおまかな説明は
>>781 な感じでいいと思う(RDDsの説明としてははしょり過ぎな気がするけど…)
面白いのは熱心な企業は、Yahoo, Intel, Adobeをはじめとして、従来Scalaの採用パターンでよくある、急成長したWeb系
スタートアップ企業「ではない」ところ。開発者/ユーザコミュニティも、従来のScalaコミュニティと違ったものになってる感がある
次のCDH(Cloudera’s Distribution including Apache Hadoop)にSparkが入ることで、Hadoop使ってるユーザ企業はSparkをかなり導入しやすくなる
だろうし、Sparkはうまいことやってるなーと思う
もちろん、Hadoopなんて知らねえよというかそもそも使わない企業にとってみればどうでもいい話だけど Hadoopが実際にどんだけ使われてるかを考えれば、そういう企業がSparkも採用することで、結果的にScalaが より広まるという面があってまあ悪くないと思う。Sparkの用途だとScalaのコンパイル速度の遅さとかのデメリットとされてる ものがほとんど問題にならないし
ありがてぇありがてぇ
結局、このスレの多くの人間には関係ない代物か
そうともいえるが、Scalaの裾野の広がりって意味では悪くないと思うよ AMPLabという研究室発プロジェクトなのに、現在はYahooやIntelのような、特別Scalaを重視してるわけでもない大企業のエンジニアが コードにコミットしてる状況はこれまでのScala界隈では少なかったし(Twitterは中でScala使いまくってるからあれだけの内製ライブラリ ができたわけでちょっと状況が違う)いい傾向だと思う
コモディティ化する前の技術を簡単に切り捨てて さっさと自滅していってくれるのは正直ありがたいわ
n○○○○○さんは、新しい技術をディスってる暇があったら少しは勉強に時間を使ったらどうか。 手持ちの古い技術が陳腐化して、おまんま食い上げになっても誰も助けてくれないよ?
.
792 :
デフォルトの名無しさん :2014/01/07(火) 00:38:27.59
日経ソフトウェア最新号によると今年の予想としてscalaがかなり普及するらしい
いやー…ないでしょそれは 極一部では使われるようになるかもしれんが
Scalaを10年保守とか悪夢だわ
>>794 どんな言語なら10年保守しても構わないんだ?
動的型付け系は言うまでもなく悪夢だし、JavaとかC#とかなら大差ない気もするが
まあScala普及は自分もあり得ないと思うけど
c,PHP,Erlang以外は難しそうだから全力で避けたい
10年保守なんてどんな言語でもやりたくない 日本語で書かれてても嫌だ
3年生き延びたら10年でも大して変わらん
俺は一ヶ月前のコードも見たくない
>>795 10年前と同じ環境をデフォルトで構築できるという意味で、 C なら構わない
scala は、scala自身よりも JRE の方がどうなるか分からなくて不安
scala自身は、JREさえOKなら、最悪、20MBくらいのjarを手元においておけばいいんだし
Cでも10年前と今じゃ使われてるライブラリに差があったり、昔のライブラリがメンテされてない可能性とか色々あるしそう簡単でも
ない気はする
Javaはまあここまで普及しちゃったから、ここ10年くらいでJRE含めて廃れることはあんま考えなくて良さそう。未だにJava 1.5より前の
コード保守してる人はしんどそうだなあとは思う。Scalaはまあ、バージョン固定でいいなら最悪
>>800 のような方法で保守可能かなとは思う
あとは、バイナリ互換性に関する保証が今後どれだけ強くなるか、あるいは現状のポリシーのままいくかは問題かな。
明るい話しよう
後先考えずにトレンドを追い続けようよ! どーせ、皆、10年後には「Code HTML For Food」 って書かれたダンボール掲げてんだしさ
Cとscalaじゃ得意分野が違いすぎるだろ… Cでwebアプリ開発とか保守以前に心折れそうだわ
cでPHPかRubyの保守まで考えることが出来れば技術者として心が休まるのではないか scalaでやりたいことって、もっとシンプルなerlangでも出来そうと妄想してみる
もうちょい自分で調べてみた方が良いよ。
ScalaのバージョンもどのOSで動かしてるかもREPLかスクリプトかも全然環境書いてないし。
ちなみにGroovyだとコレだけでいけた。
"
http://example.com/ ".toURL().text
Scalaは3年くらい前に基本的な部分をちょろっとなめてPlayで遊んでみたレベル。
そもそも3年くらい前の時点でio.Sourceは問題だらけ見たいな話しが出てたと思ったけど何か改善とかあったのかな?
文字コード指定しろってだけじゃない?
813 :
デフォルトの名無しさん :2014/01/12(日) 00:11:52.71
C++がCの割と分かりやすい、自然な拡張と言えるものだったのに対し、 ScalaってJavaに自然に関数プログラミング持ち込んだという感じには なってなくない? これなら最初から作るというか、HaskellとかF#の方がいいのでは? Javaからも移行できますよ、という宣伝文句を作りたかったのかもしれ ないが、なんか中途半端なJava親和性。
誰がScalaはJavaを拡張したものだと言ったんだ? そういうのは他にあっただろ。名前は覚えてないし、それこそ何の役に立つのかわからない言語だったが
名前の通り、スケーラブルな言語を作るのが第一の目的だったんだろうし Javaからの繋がりは結構どうでもよかったんじゃないの
ScalaはJavaにはそんなに依存してないから Javaが使われることが少なくなっても生き残れるんじゃない
それは絶対にない JVMが消えたら確実に跡形もなく絶滅する
twitterが採用したのは知っているが、そもそも何に使われてるんだ? どんな人がscalaを使うと幸せになれるの?
>>817 どっかの大学が作ったモノみたいだから、JVMが消えてもscalaは教育用に最小セットだけ残して開発が続く気がする
>>818 JVMを使う必要があって仲間内だけで完結する開発で長いこと保守する必要がないとき
誰得
そういや少し昔はJavaの次はScala!みたいにわめく人いたけどいなくなったよね。 そんなの無理にきまってるもんね
Scalaにおける正解は明日の不正解で明後日のdeprecated
javaAPIを使えるのは利点だが、javaの文法の上位互換は何の利点でもない気がするのは俺だけか…
>>824 そういうわけではなく。
研究用言語だった頃の名残の腐ったAPIが放置気味だったのが、2.10で言語仕様拡張に一区切りついたのもあって
Faster, Smaller, Stablerが目標であるScala 2.11(以降)でいくつもdeprecatedにされる(予定)という経緯がある
あと、腐ってはいないけど利用者が少なくてあまりメンテナンスされていないライブラリが別jarに切り離されたりとか
これまで皆問題だと思ってたけど優先度が低かったものが、利用者層が増えるにつれて優先度が高くなったという事かと思う
scala-swingたん……(´;ω;`)ウッ
>>816 >ScalaはJavaにはそんなに依存してないから
>Javaが使われることが少なくなっても生き残れるんじゃない
でも入門書でもなんでもやたらメリットとしてJava親和性みたいなものを
強調しているの多くね?
あれらは単に名前が広まればいい、という根拠なしの宣伝なの?
JVMと関係ないならScalaの価値なんてHaskellに遠く及ばない
831 :
デフォルトの名無しさん :2014/01/12(日) 13:58:31.80
Scalaの発案者かつ現在大学教授で開発者でもあるMartin Odersky氏のことが分かってないな。 ・ドイツ人、スイスの大学で博士号を取得。 ・IBMとか米イェール大学時代に、Java Genericsを設計した。また現行世代のJavacの開発者でもある。 ・現在は、スイスの EPFL大学の教授。 Functional Programming Principles など。 Coursera に公開している講義もあるから、興味ある人は世界中のだれでも講義を受けることもできる。 ・Scala言語をサポートのための会社 Typesafe Inc. を起こし運営もしている。 つまり、現行のJavaの功績者でもある人が開発・運営している言語だからというのが大きい。 あと、新しい言語だけあってもだれも使わなくて、ライブラリが充実してないと使えないので、 まずは既存のJavaのライブラリをシームレスに使える言語にすることで、 今現在Javaを使っている人にメリットを提供していると思われる。 ただ、Java使ってない人にとってはJVMは足かせなので、ローカルバイナリ版も作って欲しいなあ。 でも、それって、Javaの使えないScalaなんて、って感じだな。 この辺、次スレでは、FAQに入れておくべきだな。
>>820 CSPがどうとか、並行プロセスがどうとか、そういう話ききたいの
何故すごいのか説明できなくなると、作った人の学歴がすごい、経歴がすごい、 とか言い出すと末期だよね。
・IBMとか米イェール大学時代に、Java Genericsを設計した。 余計なことを。
.NET版やLLVM版に参加するしかないな
>>833 作った人の経歴が凄くないと叩くくせに…
838 :
デフォルトの名無しさん :2014/01/12(日) 20:53:27.23
Scalaのいいところは書きやすい割に速いところ コンパイルの速度とJVMの足枷さえどうにかなれば最強なんだが
REPLでスクリプト読み込むときにストレス感じるけど、それでも速い部類なのかな?
それが直ればって書いてあるやん じっこ
REPL読み込みで支配的なのはコンパイル速度で、早い部類ってのは実行速度の話だろ
動き出せば当たり前なんだけど、Pythonなんか目じゃないぐらいに速い 動き出すまでの時間が短縮されれば言うことなし
>>825 ホントに、この手の文章は何度よんでも胸がトキメク
そして、今では何よりもPHPが大好きになった
>>834 Java Genericsは複雑になり過ぎた面はあるけど、言語/バイナリの下位互換性を維持しなければいけないJavaへの拡張としてはあの辺が限界だったと思う
ちなみに、OderskyがGJ売り込んだわけじゃなくて、Pizza(1996)のGenericsに注目した当時SunのGilad Bracha(現MS Research)らがコンタクトとってGJチームが結成された
その後、Oderkyの書いたGJ組み込まれたjavacが1.3からGenerics Off状態で公式のものになって、さらにその後、Wildcardの機能追加(これはOdersky関わってない)を経て
現在のJava Genericsに至る
初心者にオススメできる言語ですね
>>831 重要なポイントが抜けているような。Oderskyの研究者としての業績はあるけど、それは主要因じゃなかろう
一から再設計した静的型付きOO/FP言語でありながら、Javaの型システムとの親和性を重視して、結構妥協した言語仕様にしたこと
型クラスとかモナドとか、学術的な文脈を持ち込むと恐怖の対象になる機能をひっそりと入れて、ユーザ向けには「堅い」説明
をしないようにせず、かつ、学術研究の場ではちゃんとimplicit parameterがOO版型クラスだという事を説明してたりと、言語として
も説明の方法としても現実的なところに落とし込めたのが大きい
>>846 ああ、それが良い。
二度と新しいものに興味なんか持たず、素のJavaで生産的なことしてくれる
ScalaはJavaより短く綺麗に書ける それだけで俺にとっては十分だ
>>845 プラットフォームの制限は仕方ないとしても、ワイルドカードとかあのへんの
C#なんかに比べてかなり非直感的なセンスは確かにScalaに通じるものがある
Scalaではよくても土方言語であれじゃあなあ
土方にscalaを使わせたら、土方以上の作業が出来るようになるのか?
どうだろうな 開発環境が微妙だからね
なぜ誰もが理想の言語を目指すのに誰もそれを作ることができないんだ
>>853 作りはじめることはできるが、最後の残り10%の実装が理論的にできなくてつまづく
そんな俺言語が7つくらいある
俺版「7つの言語 7つの世界」かw
多くの人に使われていなければそれは理想的な状態ではないからな MSが言語作るのが上手いのは技術オタク/数学オタクと土方の両方の感覚を理解しているから
>>853 研究者はトップダウンで地に足がついておらず、ビジネスマンはボトムアップでいつまでも低い目標を追いかけているから。
>>850 いや、JavaのワイルドカードはOdersky関わってないので。2002年のIgarashi先生の研究が元になっていて、さらにそれに改造を加えたのがワイルドカード(この中間で色々あったみたい)。ScalaにJavaのワイルドカード相当のexistential typeが入ったのは
Javaのワイルドカードを利用するために仕方なくそうなったという経緯がある(ほんとは不要なのだけど、Scala 2.7辺りでJava Genericsとの互換性を持たせるためにそうなった)
>>856 んなこたーない。.NET以前のMSが言語作りうまかったとはお世辞にも言えんが(開発環境込みでいうとVB 6は良く出来てただろうけど、言語としてのVB 6は駄目方向だよね。C#はどちらかといえばHejlsbergの功績が大きいだろう
VC++ 6は言うまでもなく。だからこそ、開発環境も言語も筋が良かった当時のBorlandというかDelphiの商売が成り立ってた(ちなみに、DelphiのアーキテクトはHejlsberg)。
>>859 >C#はどちらかといえばHejlsbergの功績が大きいだろう
こういう言い方はへんじゃね?
誰が作ったか、誰を使ったかも含めMSの製品なわけだから。
861 :
デフォルトの名無しさん :2014/01/13(月) 01:36:14.49
外面的視点はうすっぺらくてあまり意味がないんだよ。 プログラマならコードの作りやすさという内側から見るべき。
さらに言うと、C#も1.0は賛否両論、というか、ぶっちゃけあんまり評判良くなかったよね。Java支持派の人からはJavaのパクリ、劣化Javaとさんざんな評価だったし、言語ヲタや研究者から も、Javaを根本的に改善したものではなくマイナーチェンジでしかないような評価が多かった。本格的に改善/支持されるようになったのがC# 2.0からで、.NETのCLR(ランタイム)の刷新と合わせて ランタイムのサポート込みのGenericsの導入、匿名メソッドの導入等が入った。C# 3.0でさらに改善されて…という事があったわけだ。
確かに初期にあったよねC#はJavaのパクリみたいな安易な批判。 まあMSがやることは叩いとけみたいな人はいつもいたからだろうけど。
>>860 確かに、誰に任せたかも含めて当然会社としての戦略ではある
ただ、MSが言語作りが上手いと主張するには、会社の戦略としてMSが従来から優秀な言語アーキテクトを抱えることを重視してたという事の状況証拠がないといけないだろう
VB 6は開発環境と言語の統合重視という路線でみればいいんだけど、言語としてはまあ良くなかったよね。で、言語自体の筋がよくなったのはHejlsbergのBorlandからの移籍辺りが鍵になってるん
じゃないのか、という話。時期と断片的な状況証拠からの推測ではあるけど。
なんでMSにばかりそう厳しいの? 会社をなんか人格持つ個人みたいに考え過ぎじゃね?
経緯はどうあれ、現在トップクラスに普及している言語のうち最後発のものを生み出したわけだからなあ 設計者個人のセンスやMSの金だけでどうなるもんでもないよ
C#が評価されるべきなのは、かなり過激な拡張を繰り返してるのに 下位互換性が保たれてて目立った破綻や失敗がないこと まあMSのレベルまではいかなくても(ユーザーもそこまでは望んでないだろうし)、 Scalaを広く普及させたいんなら少しは見習わないとな
>>865 うーん。会社を人格持つ個人とは考えてないけど。「MSが言語作るのが上手い」に反応してのレスとして、特段MSが上手いわけじゃなかろうというか、偶発要因が多分にあるだろうという話
別にMSに厳しいつもりはない。というか、特にR&Dも基礎研究(短期的な利益に結びつかない)もちゃんとやってるMS Researchに継続して投資してることは素晴らしいと思ってるよ
ちなみに、MS Researchは、急成長した企業にありがちななんちゃって研究じゃなくて、学問的な意味でもかなりちゃんとした研究所
OSの仕様を確認するたびに金とられるのを経験すればMSが嫌いになるのも無理はない Linuxとかでも同様のサービスを得ようとすると結局同じくらい金がかかるんだけどね
MSが悪いときはMSの悪口をいい、MSが良いときは、いやMSがいいせいじゃない、〜という個人のおかげなんだ、みたいな話をされればそりゃどっかバイアスかかりすぎじゃね、と指摘したくもなる。
>>863 まぁ、MS は Java に「塩を混ぜた」っていう前科があったからね。
その延長線上に C# があって、登場時には Java vs. C# って記事
が結構でてた。当然、日本の雑誌では C# が Java に比べて如何に
優れているかって事を滔々と述べていたっけ
>>870 「MSがいいせいじゃない」なんてどこで言ってるんだ?
HaskellもF#もMSRなんだよな
Javaは昔から叩かれ続けてきたプログラム言語だけど それでもここまで来た Scalaもこれからが正念場
スーダンが北と南で分裂してるけど、南ってキリストなんだってな で、北がイスラム Linuxのディストリが色んな種類あるのに、Windowsは1個しかないところとか 力をつけさせない為には団結させない事が大事だと分かる
WindowsもXP派とか7派とか8派とか色々いるぜ
scalaとC#を機能比較するならまだしも、ただ単にC#はいいMS最高!とscalaスレで布教してるだけだもんなw
Scalaは廃れそうだよねえ
>>875 いまでもVBやPerlを使い続けたい?
prologで99problemを解いた方が賢くなれると思うんだ
廃れそうも何も、流行っていた・流行りそうというのは単なる幻想であった
>>878 頭の良い人たちが使い続けるからコミュニティは続くと思う。私は素のJavaを使う
個人的な話だとScalaを使わない理由は特にない 上から使えと言われないから使わないだけで
>>879 仕事のプロジェクトのメインの言語はいまだにCOBOLです
関数型COBOLを作れば売れる!
COBOL開発って設計はわりと関数型的なところがあるけどね
質問です。 変数Aを持っているクラスの複数のインスタンスがあり、 インスタンスごとにAの値が違うときに 最小(最大)のAを持つインスタンスを返すみたいな関数はどうやって書けばいい感じになりますか? 現在はforとifでやっています。
>>888 ありがとうございます。
コレクションを扱うメソッドの種類が豊富でいい感じなんですけど、覚えるのが大変ですねこれ…
メソッド繋げていって上手くいったらすっきりするけど、 悩み抜いた末に汚く書くしかないことに気づいたら最悪
Scaloid使っているアホいる?
コレクションのメソッドの引数に度々、 n => n %2 == 0 みたいなのが入ってますがこれが関数を引数として渡すということなんですか?
はい
はい
ありがとうございます。
形は引数 => 本体 返りの型はBoolean
コレクション.メソッド().メソッド()…って何個も書いてるコードがあるけど あれはscala特有のものなの?
書いてあることの意味がわからない
899 :
デフォルトの名無しさん :2014/01/16(木) 22:02:17.28
javaにもあるじゃん 流れるような〜って奴
>>897 ぜんぜん
あのスタイルを流行らせたのはRubyで、さらに遅延評価でスケーラブルにするのを流行らせたのはC#かな
メソッドチェーンはjsの御家芸だと思ってたよ
jsくらいなら毎度コピーでいいけど、 スケーラブルな言語を標榜するならコレクションの演算はストリームのみにするべきだったよなあ
scala練習してるから書いたコード見てくれって渡してくるやつで コレクション弄るときに毎度毎度forでやってるやつがいるんだがこれは指摘した方がいいのか 推奨の書き方はどんななんだよ
Cしかやったことがないか、頭が腐ってるかのどっちかだから関わるな
Java8もストリームで同じようになるね
>>903 結果をコレクションで返す場合
for(i <- (0 to 10)) yield i
手続き(結果がUnit)の場合
(0 to 10).foreach(i => print(i))
map使った方がいい気がしないこともないけどな
>>907 要素の並びを、「手続き, リスト」 じゃなくて、「リスト, 手続き」 にしたいという理由だけで for類を使っている
>>908 コッペロンナーwwwwwwwwwwwwwwwwwwwwww
>>904 Linusがscalaを使えば最強のOSが作られるな
クラスで自分自身が持ってる変数を指したり、自分自身が持ってるメソッドを使用したりするときに this.って付けたほうがいいですかね?
912 :
デフォルトの名無しさん :2014/01/17(金) 14:15:09.11
つけなくてよろし
ありがとう
貴方たちは心が弱いから、書きやすさを追い求めるのです
同意。しかし心の強い奴は限りなく脳を硬直させていってしまうんだ。完全に石化したときには寿命がきてるから助かってるだけで。
そうやって、皆、何者にも成れず死んでいくんだ
思ってよりここ人多いね 自演かな?
なんでタプルだけ扱いが違うんだよ面倒くせえなおい
不自由な構造体が必要なんです
タプルが()で要素の指定ができないで、番号は1からなのはなんか理由があるの?
最近お腹がタプルタプルしてきたなり
>>920 ()じゃ型安全にやれない
1からなのは他言語からの歴史的経緯
なるほどな 時々使うけどいつも0から始めてエラー吐かれて一瞬思考が停止するんだよ
普通のコレクションだと同一の型しか入れられないけど、タプルは何でも入れられるからおかしな感じになる 絶対に同じ型しか入らない場面でコレクションに変換できないのは辛いけど
def toList[T](t: Tuple2[T, T]) = List(t._1, t._2) みたいなの延々定義しとけば?
>>924 (Int, Int)にはIntの組しか入れられないし、(Int, String)にはIntとStringの組しか入れられないけど?
(Int,String)(0)と(Int,String)(1)でコレクションと同じようにで中身が取り出せるとあかんやろ
いや全然
> 普通のコレクションだと同一の型しか入れられないけど、タプルは何でも入れられるからおかしな感じになる タプルはコレクションじゃない。同列に語れない。
正直、束縛すればいいだけだよな
タプル=簡易クラス ってことになってるけど本当にそれでいいのかい?
933 :
デフォルトの名無しさん :2014/01/18(土) 21:47:27.22
いいんじゃない
タプルなんて要素数は精々4個ぐらいだろ 中身が予測不可能のグチャグチャになることなんてないんだからおとなしく._1使っとけ
タプルは要素ごとに次元が違うものだからループ回して添字でアクセスしたりするのは間違い そういう意味で、単なる識別子だというのを強調するために1ベースなんじゃね
937 :
デフォルトの名無しさん :2014/01/19(日) 03:58:10.52
おっけー
> 単なる識別子だというのを強調するため いや、単なる歴史的経緯。
項数で識別したいこともある
>>938 主流言語の発展と、タプルの採用状況からみると、とても歴史的経緯とは思えないが‥‥
使えるとして多値返しのからくり用途くらいにしか
>>854 わかるわ。エベレストも残り10%が困難。
引数に複数の型を取れるようにしたいんだけどどうすればいいですか?
できません
エイサー型使え
>>940 Wikipedia によれば、Scala は Java, Haskell, Standard ML, OCaml, Smalltalk, Erlang から
影響を受けているとされているから、それらについて「歴史的」と言っている。(ただし Java はタプルがないから除外)
(何が主流言語なのかわからないけど、それについて言っているわけじゃあないよ。)
そして、その「歴史的」な言語は、どれもタプルの最初の要素を fst や 1 としてアクセスする。
1行目と2行目のつながりがよくわからんが、勝手に想像して補足する。
>>938 の言っていることは
「歴史的経緯からタプルの要素は 1 から始まるべきである」ってことであって、
「歴史的経緯からタプルの実装は必須である」ってことじゃあないよ。
リレーショナルデータベースとの連携を考えるとタプルがあると超便利なんだ
ORMないの?
RDBはデータをアリティでも区別してて、それをタプルでそのまま表現できるっていう、理論の表現とコードの見た目が近いというただそれだけの話ではなかろうか
せっかくSQLという素晴らしい宣言型言語があるのにORMなどという糞に頼るな
どっちがいいのかねぇ。仕事ではSQL使ってるけどORMも捨てがたい。
>>945 むしろ1オリジンは「自然」で、C系言語の0オリジンが特殊なのでは?
配列へのアクセスa[i]を*(a + i)で定義しちゃったから、これはこれで合理性があるわけだが
要するにメモリアドレスを意識しているかどうかだと思う
SQLとORMは二択じゃないだろ
この言語が流行らない理由ってなんだろうね 純粋関数型言語よりは取っ付きやすいし、betterJavaとしてもいい感じだし
インスコが面倒
クエリは普通にSQL書くから、ORMは余計なことしないでselectとvaluesのマッピングだけやってくれ
>>953 better JavaといえるのはGroovyとかC#みたいなのだろ
JavaとScalaは良くも悪くもCとC++の関係に近い
書きやすいから自分1人でやる分にはいいんだけどねえ
コレクションをどうにかやるメソッドってScalaはやっぱり多いの?それとも他の言語もこんなもん? 人に勧めるのにこのことを言っていいのかよくわからないから教えてほしい
959 :
945 :2014/01/21(火) 21:56:02.48
>>953 コンパイルとREPLでストレスがたまる
>>961 けど、時間が経てばそれも解決するのかな?
昔のCやJavaのコンパイラだって遅い遅いと言われていたけど
ハードが進化してそうでもなくなったように。
自動ビルドしてくれるからコンパイル時間は気にならないかな。 C++よりは速いし。 流行らないのは世間のJavaプロジェクトはウォータフォールがっちりの 融通聞かない案件が多いからだと思っている。 それとunix好きのマッチョたちがJVM言語を敬遠する傾向にある印象がある。
彼らは幾度となく人に裏切られて、己すら信じることが出来なくなった人です。 全ては心の問題。
コンパイル時間の話になってるから俺も不満に思ってる話をしようとして その前に使ってないeclipseのscala IDEを試したんだけど これコンパイルから実行まで超早いな って言うかIntelliJ超遅いな 速度に関して言えば、scala IDE>>>コマンド直打ち>IntelliJ くらいの差があるように思う なんか今までIntelliJ使ってて損した気分だわ でもスクリプトファイルの実行はscala IDEでは出来ないのね 個人的にはこっちが早い方が助かるんだけど…
コード編集はintellijでやってるけどコンパイルと実行はsbtでやってるわ
並列コレクションってどんなときには使えないの?
オブジェクティブに、関数型に近づけていくほど遅くなるんだが
>>967 ある要素に対する処理が他の要素に対する処理結果に依存しているとき(データ並列性がない)
処理が細かすぎるとき(使えてもクソ遅くなる)
これらに当てはまらなくても、基本的には普通にシングルスレッドでやるより遅くなるケースがほとんどだよ
並列処理は同期を減らして処理の粒度を上げて計測して試行錯誤してやっとパフォーマンスが出る
>>968 気合入れて綺麗に書き直したら遅くなることあるよね
使いやすさは最高なのに、遅いと泣きたくなる
特に関数型に特化した高度な最適化とかあるわけじゃないからな 所詮Java
C++とかJavaとかの延長で書くのがなんだかんだで1番速いから困る 読みづらいけど
>>965 もしかして、eclipseが使いづらいのって俺だけ?
emacs+コマンドプロンプトの方がいい
eclipseが使いやすけりゃ、PHPなんぞ流行らん
PHPの流行について言えば、HTMLが書けるデザイナから見た時にハードルが低そうってのが主な要因じゃね。
というか、使いやすいと思ったIDEに出逢ったことがない
俺はnotepad.exeで頑張ってるよ
御老体乙
>>977 あんな編集効率の悪いゴミエディタを使ってるとか、あんまり言わないほうがいいよ。
プログラマとして恥ずかしいことだから。
981 :
965 :2014/01/23(木) 12:47:21.46
>>973 コンパイルから実行までの速度に「限っては」eclipseが最高なんじゃないかって事ね
俺も全体としてはeclipseはちょっと使いづらいって思ってるし
正直誰かに「こっちの方が早いぞ」って他の例を出して欲しいよ
twitterではデータ処理はScalaで、htmlとかの出力は他言語でってどこかに書いてたけど そういう言語間の連携はどうやってるんですか? 大量の計算をする部分をC++、他をScalaでやりたいと思ってるんですができるんですかね
俺はcsvとかsqliteを経由して連携してる JNI使うともっとシームレスにできるかもね
FinagleでRPCじゃない?
ありがとうございます。それらを調べて勉強してみます。
連携のオーバーヘッドが無視できる程度に計算にそこそこ時間がかかるんなら JNIみたいなデリケートな仕組み使うよりばっさり分けちゃったほうがいいよ
>>982 Twitterって、フロントエンドは JRubyで、他はJavaとScala じゃなかったっけ?
つまり、JVM系で連携している。
OSXのターミナル?で作ったプログラムテストしてるんだけど、 進捗を表示する時に上に流れていかず、その場でどんどん更新されるようにはできないですかね? 上手く説明できなくてすみません。
キャリッジリターンやバックスペースで行頭に戻してから出力するとか?
>>991 キャリッジリターンというのを初めて知りました。ありがとうございます。
あんまりよくないプラクティスかも知れないけど、 RDBはmapを永続化するものとしか使っていない。 SQLをちゃんと吐けてもRDB側が突然変な処理をし始めることがしばしばあるんで
それは普通に吐いたSQLの方をまず疑うな。 なんかかんかいいつつデータの整合性を保つ点に関してはRDBが実装もノウハウの 蓄積も一番しっかりしている。
.
.
.
∧,,,∧ ( ・∀・) 1000ならジュースでも飲むか ( ) し─J
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。