16:482017-04-07■http://anond.hatelabo.jp/20170407112743意識低い企業内研究者です。プログラミングはサブウエポン。働き方改革のせいで早く帰れって言われて、酒のみながら今これを書いてる。C言語とかC++は・・・これで作らないといけないものが今の所ないし、これでお金を稼ぐのはハードルが高いし、WindowsのAPIを使って複雑なプログラムを作りたいわけじゃないのでwhileとかifとか基本的な構文だけ覚えるだけで満足。組み込みプログラミングではC言語はいまだに現役。お金も普通に稼げると思うよ!次代のCOBOLと化しそうで怖いとこはあるけど。Javaは・・・使える人が多いからあえて今から学習しなくてもいいような気がする。文字列の結合だけでもダメやり方と良いやり方があるらしくて、何かPHPのようにその言語特有のセオリーみたいなのを覚えるのが面倒くさそうなので入門の時点で学習するのをやめた。セオリーとかあるかもしんないけど速度とか気に揉むまえに書いて測れ。杞憂か、あるいはCPUパワーで殴れるから。Goは・・・HTTP/2が使えるから学習してる。他の言語だとnghttp2をインストールしないといけないようなのでGo便利だと思ってる。ライブラリの選択肢が多すぎるのでこういうのが作りたいってときにこれを使うのがいいよっていうのが知りたい。GUI作るのにライブラリありすぎてどうやって選べばいいのかさっぱりわかんない。Goでデータベース扱うならこれを使え、だけどMySQLしか使わないならこれを使え、あっSQLiteならこっちのライブラリ使うと便利みたいなこういう情報が欲しい。GoでGUIつくるの?あんまり普通じゃない気がする。軽量プロセスのうまみがそんなない(詳しい人に否定されそうだけど)普通にC#(mono/.net)かwebアプリにするかで良くないか?ただ、言語をあれもこれも覚えるのって僕は意味があるのかなという思いもある。World出来るより、1つの言語でいろんなアルゴリズムを知っている方がすごいと思う。コミュ症がフランス語や英語やドイツ語覚えても、使う機会がないとまったく価値がないと思う。アルゴリズムは使うものだ書くものではない!!広く浅く学習するより、狭く深くいきたいとおもうけど、paizaでCランクしか取れない。twitterで有名な人てやっぱりSランクとか余裕なのかな、こういうのもいろんなプログラマーに聞いてみたい。一応著名なプログラマーをTwitterでフォローしてるけど、ご飯の画像を載せてたり、若者の僕には通じない寒いギャク連発してたり、ロリっぽい画像をRTしてたりと、twitterはメインの情報収集としては利用してない。twitterやってるプログラマーって勉強会とかオフ会に参加してるようなリア充の人ばっかりなので、肩身が狭いから自分からリプは送ったりはしない。ファンがたくさんいるのに最近ニコ生配信してくれないchokudai先生みたいに、アルゴリズムを学ぶのがいいのかな。深さ優先探索とか理解できない。コードを写経しても覚えられないし、仕組みは理解したけど自力でコードが書けない。コードにする能力ってどうやって鍛えるのか知りたい。アルゴリズムは使うものだ書くものではない!高階関数とかテンプレートプログラミングとかその辺勉強するといい。あと計算が制限時間内に終わるなら総当たりが最速で品質も高いぞ。エディタはサクラエディタからVimに変えた。してVimかというとプラグインが多いしIDEっぽくできるから。Vim使う一番の理由は補完が強いのが気に入ってるから。Vimってハードル高いイメージあったけど、入門記事がたくさんあるので助かっている。NetBeansが重すぎるんだよ。補完ボックスが表示されるの遅すぎて警告メッセージが出た。補完ボックスが表示されるまで7秒ぐらい経過すると警告メッセージが表示されたと思う。CUIならnanoでいいよね。パソコンのスペックもどのくらいのものを用意したらいいのかわからない。グラボなしノートだからプログラミングに向いてないのかもしれない。VirtualBox上のubuntuでMySQLをコンパイルすると2時間20分ぐらいかかった記憶がある。CPUが1コアなのでコンパイル中にそれ以外の作業なんて重くてできない。スペックにお金をかけることで時間の節約ツールの選択肢が増えるEclipseなどのIDEが支障なく使えるレベルのスペックってどのくらいするんだろう。i3、メモリ4GBにランクアップしたらいけるのかな。他人がどんなスペックのPCで何のツール使ってプログラミングしているか知りたい。最近はもっぱらJupyter。早いPCが欲しいけど、年度末に買うのを忘れた。Pythonは・・・・機械学習する上で避けて通れないけど、今のPCだと無理。例題が豊富で逆引き辞典みたいなサイトや本がほしい。あと、クレジットカード持てないのでAWS上で機械学習するのだけは遠慮したい。過大請求されるの怖いし、トラブルが起きた時に英語でコミュニケーション出来ないから。Pythonはいいぞ、機械学習だけじゃなく計算系はエクセルじゃなくてJupyter使う。周りはエクセルつかってる、勿体ない。使ってないけど最先端の研究では機械学習使って当たり前感があってそろそろヤバい。僕は中学生の頃、いじめにより心の余裕なんてなかったから勉強どころではなかったけどもっと英語の勉強しておけばよかったと後悔している。子供の頃の生活環境って大事だなと思う。今は英検3級に向けて勉強中。APIドキュメント頑張って読もう。俺も頑張って読んでる。何を学習したらいいのか本当にわかんない。なんとなく、プログラミングじゃないほうがいい気がするなあ。バイトしてPC買わない?プログラミングのバイトでもいいと思うよ。働き方改革最前線からは以上です。22:202015-05-18■関数型言語が普及しない理由が分かった関数型言語なんて、多くのプログラマにとって猫に小判、豚に真珠ということだ。コミュニティの文化が独自とか、学習コストが高いとか言われているが、それは本当の理由じゃない。本当の理由は、オブジェクト指向言語すら使いこなせていないのに、関数型言語なんて必要ないという理由だ。オブジェクト指向言語を使い倒していれば、同じ概念を関数型言語ではずっと楽に実現できることにすぐに気づく。逆にオブジェクト指向言語で無理して使っている概念(例えば高階関数など)がないと利点に全く気づけない。普段余計な一手間を加えてでも、実現したい便利で強力な概念を、そもそも使っていないのでは、関数型言語を書く意味はない。関数型言語でもオブジェクト指向言語でも、やることは変わらないとずっと思ってきたし、それなのになぜ関数型言語が普及しないのか、ずっと不思議だった。未熟なプログラマには無用の長物だということだ。15:412015-02-11■関数型とオブジェクト指向って......毛の壁以降、色んなところであーだこーだ再定義言われてるけど、結局名前が悪いんだよなぁ。どちらかというとオブジェクト指向の方が「何もかもサブルーチン(ただし値を覚えていてくれるおまけつき)」で、関数型の方が「何もかもが値(関数も)」なんだけど、まず名前からだと逆っぽく聞こえる。加えて、この二つの概念が対立すると思われてしまうけれど、んなこたーないのはjavascript見れば分かる。何もかも値かつサブルーチン、でOK。両立しにくいのは、オブジェクトの概念と高階関数の概念ではなく、オブジェクト指向言語が採用してきた型システムと、関数型言語が採用してきた型システムだ。C++やらJavaやらが採用してきたサブタイプ多相をベースにしたクラスによる型付けと、ML系言語が採用してきた代数的データ型が噛み合わない。いやまぁScalaは頑張って統合したけど、コンパイル遅いわ書き方次第で型チェックが無限ループになるわで、色々と無茶しやがって感ある。23:222014-09-14■「手に職」って詐欺みたいなもんなんだな当方いわゆるweb系プログラマ30代。大学は卒業に失敗しているので学歴としては高卒。年収は800万に届かない程度。web系プログラマはインターネット上で目立っている有名プログラマも多くて、彼らと自分を比べると絶望するくらいに自分のスキルは低い。送って取り込んでもらったことがあるという程度)。このレベルの人間が周りの年上プログラマを見てると、「なんだ、こいつらが食って行けるなら、俺は楽勝で食って行けるじゃん」って思うことが多い。「その辺のちょっとだけできる大学生のほうがよほどまともだぞ」みたいなコード書く人間がのうのうとプログラマとして食って行ってる。ほんとうにひどいやつらが多くて、一番笑えたのが「経験豊富だしどん欲に学習してきたのでどんな言語も対応できます」って言ってた39歳の人間で、彼は「高階関数」という概念がまったく理解できなかった。「関数ポインタを引数で渡すみたいなもんですよ」って言ったら「関数ポインタとか実務で使うことないしwwwwwww」みたいに返されて絶句した。わかればなんでも書けるし」みたいなこと言ってるやついるけど、「あーこういう人間がああいう書き込みするんだな」って変に納得できた。そのひとは会社からそこそこの金をもらってた。それ見て思ったんだけど、いくらひどいコードであっても、「とりあえず動くものが作れる」っていうのはスキルの一種であることには違いないんだな。絶対に一緒に働きたくないし、そいつが書いたコードは絶対にメンテしたくないけど、メンテナンス性がどれだけ大事かってことを理解している経営層っていうのは少ないみたいで(これは経営層じゃなくてむしろプログラマ側のコミュニケーションスキルの問題の気がする)、とりあえず動いているように見えるものを作ることさえできれば、お金を握っているひとからお金を引き出すことは可能なんだな、ってことをそいつを見て理解した(またこいつが「コード読めないひと」をだますのがうまいんだ)。ここで初めてタイトルにつながるんだけど、ようするにそれが「手に職」ってことなんだな、って思ったんだ。詐欺ってのは言い過ぎにしても、「手に職」って言われる職業ってだいたい寡占なんだよね。資格がないとできない職業は資格を持った人間の寡占状態にある。プログラムを書くのに資格は必要ないけど、プログラムの読み書きは未だに特殊技能で(これは教育の問題だと思う)、コードのメンテナンス性の善し悪しを判断できるのもまたプログラマだけであるという意味でやっぱり寡占状態にある。自分はプログラマだからこの寡占状態に恩恵にあずかっている側で、おかげで「ひとまず職にあぶれることはなさそうだな」っていう安心を得ることができているんだけど、この寡占状態って絶対不健全で、たとえば誰の目にも数字という形でわかりやすく現れてくる営業(一方からの勝手な見方で、営業の世界にもいろいろあるのかもしれない、イメージで語ってゴメン)だったら、「あいつ数字悪いな、切ろうぜ」ってなるレベルの人間が「まあでも我々にはプログラマの世界はわからないからなぁ、彼は優秀っぽい雰囲気があるし」みたいな感じでお金をもらうことができるんだもん。「手に職」って詐欺っぽい要素があると思う。そもそも「手に職があれば食うに困らない」って時点でおかしいじゃん。最低レベルの営業職と、最低レベルの技術職、どっちも最低のはずなのに「俺は技術職で手に職があるから困らない」ってどう考えてもおかしくない?やっぱり詐欺だよこれって。これ読んでも関数型分からないけど、入り口の前あたりに立つために関数型言語覚えたらなんの役に立つの?プログラマとしての引き出しが増える。書くと「そんなもんどんなプログラミングテクニックだって一緒だわ」って言われそうだけど、でもそうとしか言い様がない。オブジェクト指向と同じで、プログラムを構造化して、複数のレイヤーに切り分けて部品化していくテクニックだとは言える。オブジェクト指向とは大分切り口が違う。何ていうか、割と直交する切り口でプログラムの構造を切り分けていく。関数型とオブジェクト指向と両方憶えるだけで、大分切り口の引き出しが増える。オブジェクト指向と関数型両方憶えると、プログラマとしての引き出し増やすのに効率が良い、って思えば良いかも。具体的にどう切り分け方が違うの?オブジェクト指向は、プログラムの各部品を「あれの中のこれの中のそれの中にあるあれ」みたいな感じで組み合わせる。部品が更に細かい別の各部品で構成されていて、それぞれの部品が噛み合わさって、複雑な一つのプログラムを構成するような切り方。関数型言語は、プログラムの部品を「あれをした物にこれをした物にそれをした物にあれをする」みたいな感じで組み合わせる。いうとプログラム全体を簡単に記述するできるDSLがあって、そのDSLを簡単に実装するためのDSLがあって、DSLの入れ子構造で一番小さい部品はシンプルな関数、みたいな切り方。使い分けたら良いの?ケースバイケース。あるんだけれど、シンプルな部品を大量に組み合わせて構成するのがしっくりくるならオブジェクトで、部品数が少ないんだけど一個一個が複雑な動作する構成にしっくりくるのが関数型......かも?関数型言語の紹介見てると、何かひたすらイミュータブルなデータを弄繰り回す説明ばっかり出てくるんだけど......関数型言語たる条件として「関数が第一級オブジェクト」ってのがあるんだけど、関数が第一級オブジェクトだとイミュータブルなデータを素直に扱える。イミュータブルなデータ構造使うと色々便利、ってことで実例として一番出てくるという。何か型型言ってるんだけど、型くらいC言語にすらあるわ。メモリ領域の確保量を示すあれが何でそんなに重要なの?関数型言語のエポックメイキング的な言語が三つくらいあって、元祖のLispとその流れ汲んだMLとMLの一種で関数型をある種の到達点に持っていったHaskellって感じ(独断と偏見)。このうちのMLって奴が、プログラミング言語に型システムがついてるんじゃなくて、型システムにプログラミング言語がついてきた存在だったりする。型で色々やるために生まれたわけで、まぁなんというかそもそも型と密接な関係にあって、Haskellもその流れを汲んでて、こいつが超有名になった、って感じ。おかげさまで、型使って色々やったりする方法が日々考えられているわけです、静的型付関数型の世界では。自分自身の構成部品憶えてられないわけだから。クロージャあると憶えててくれるわけですよ。そんな感じで高階関数を実用的なレベルで使うのには大体必須と言う。何が便利なん?関数型言語はDSLを作りまくる言語みたいに書いたけど、モナドはちょっと複雑なDSLを簡単に作らせてくれる仕組みだと思っとけば良い。Haskellは副作用が一切ない純粋関数型言語って言うけど、副作用なしでどうやって入出力してるの?まず純粋の定義だけど「全ての関数は同じ引数を与えられた際、必ず同じ値を返す」ってことで、これがいわゆる副作用がないって状態だ。これって逆に言えば「プログラム内である関数に対して、絶対に同じ引数を与えさえしなければ、その関数がどんな値を返したところで、事実上純粋だと言えてしまう」ってことでもある。本末転倒感があるんだけど、HaskellではIOモナドという仕組みと特別なmain関数を使って「呼び出すたびに絶対に違う引数を自動的に関数に与えてくれる仕組み」を実現していて、こいつを使って入出力する。うん......凄い本末転倒。ちなみにこの自動的に与えられる引数はRealWorldって名前がついていて、要は「刻一刻と変わり続け絶対に同じ状況にならない現実世界の状態を引数に取っちまっているようなもんだからしょうがないだろ?」的な感じ。19:422007-11-10■関数プログラミングにおけるFizzBuzz問題いくつか考えてみた(問1)高階関数と再帰関数を必ず使って数値を要素とするリストの要素の総和を求める関数を書け。高階関数を使うという要件と再帰関数を使うという要件は同じ関数で満たしてもよい。つかって数値のリストの最大値を求める関数を書け。高階関数を使うという要件と再帰関数を使うという要件は同じ関数で満たしてもよい。いうのは簡単すぎるか?簡単すぎるなら(問3)高階関数と再帰関数を必ず使ってある数値に5を足し、10かけて2で割った数を求める関数を書け。高階関数を使うという要件と再帰関数を使うという要件は同じ関数で満たしてもよい。こっちの方がいいかな。トリッキーすぎる気もする。一応問題を出したので、SchemeとPythonで自分で想定している答えを書いておいた。はてなではSchemeが人気のようなので、あまり知らなかったけど関数言語ではSchemeで書いておいた。Pythonで書くのはSchemeだけだとわかりにくいので、なにかスクリプト言語で書いておこうと思ったから。Rubyの方が人気なので、はじめはRubyで書こうと思ったけど挫折した。だれかRubyで書いてくれないかな・・・。コードオブジェクトってなによ。いうか関数はオブジェクトなのに引数にできないの?なんで?(以下疑問と愚痴の嵐なので略)Perlは古株が多くてユーザー数も多そうだけど、・・・その・・・無理です・・・。あの言語仕様はやる気がしない。ぶっちゃけ理解できない。Pythonを知らないひとは多そうだけど、知らなくてもSchemeよりは感じは掴めると思うのでPythonでも書いておくことにした。Scheme編http://anond.hatelabo.jp/20071110215936Python編http://anond.hatelabo.jp/20071110220132これで大部分のひとがこの問題に興味をもたなくて解答するひとがいなくても、興味を持ったひとは安心だね!追記:問3で次のは無しとしておきたい。22:18■Schemeによる解答あくまで自分でこう答えるという話。5)全部畳み込み関数を使っているのは、はじめ使い道がないと思ってたのにかなり使い道があることがわかったので、それを示したかったから。あとmap関数あたりはほかの言語でもあるから、すぐに思いつくだろうし。いうか最後のやつは手続きを抽象化することでリストの形で扱えるようにしているから、関数プログラミングでは重要だと思う。関数プログラミングの肝は計算によって手続きを含めたすべて表すことができることだと思っている。その例だと思うんだけどね。Schemeなら上記の答えを応用して、似たような「手続き」を生み出す関数を作ることができる。num)))))これを使うと次のようにできる。2)関数合成がつかえるならそっちのほうが楽だけど、リストという形で「手続き」をつくり出していることがわかるだろうか?手続きをリストで操作できるのだ。いうのが関数プログラミングの肝だと勝手に思っている。やってくると型推論や多相型の重要性もわかると思うんだよ。上記のようなことはPythonでもできる。高階関数はつかいすぎるとわかりにくい。どっかにバグが入ってくるかもしれない。それを機械的に防ぐのが型推論。型という観点から型推論でおかしいところを探し出してくれる。それならC言語でもいいのではないかという人もいるかもしれない。C言語は融通が利かない。apply関数にしても引数の型が数値なら数値、文字なら文字と決まっている必要がある。数値に向けにapply関数を作っても文字には使えない。した型のデメリットをなくす一方、そのメリットを享受するためにあるのが多相型。これによってapply関数やmap関数を一般的に作ることができ、型のメリットを享受しながらデメリットをなくすことができる。このように関数で手続きなんかを抽象化するときに型推論や多相型があると便利なのだ。?http://anond.hatelabo.jp/20071021143442その理由は知らないが、なければ作ればいいじゃないか。え、リストもlist.length()が使いたいって?それも簡単。6])l.length()6きちんと他のメソッドも使えるよ。