サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
大そうじへの備え
doloopwhile.hatenablog.com
ITmedia エンタープライズに、なぜ“デスクトップLinux”は普及しなかったのか?という記事が載っていました。デスクトップLinuxの失敗については今まで何度も色々な人が書いており、どうということは無い記事なのですが、 AppleのUIを最高と考える私にとって、“Macより劣るWindowsの劣化コピーでしかない”デスクトップLinux(当時はRHEL4でした)は、苦痛でしかなかったのを覚えています。コンシューマーデバイスにおける一貫したUIの大切さを実感したということですね。 なぜ“デスクトップLinux”は普及しなかったのか? (1/2) - ITmedia エンタープライズ ・・・という、Apple 信者が何度も何度も何度も蒸し返す誤った理論が述べられておりムカついたので、大人気なく反論しようと思います。 キラーアプリ Apple 信者の理論の誤りとは、ユーザーはUIでOSを選
SE語というのは「〜コマンドを叩く。」「〜例外を投げる。」 のような、エンジニアが会話でつかう言い回し。 この記事がよくまとまっています: 不思議の国のSE用語 - Qiita 上記の記事に挙げられている他に、「〜する必要があります。」「〜することが可能です。」のようなものも、エンジニアはよく使いますね。 口頭で使うなら、まあ「エンジニアって変だなぁ」で済むのですが、中には文章でもSE語を使う人がいます! 文章ではSE語は使うな!絶対に! 読み手がSE語の話者とは限らない。 なぜSE語を使うべきではないかというと、要するに ムカつくから なのですが、もう少しフォーマルに説明すると以下の通りです: 実際のところSE語を話す人はそれほど多くありません。「SE語」と言いつつも、SE語を使わないエンジニアも少なくない(場合によっては多数派な)のです。その意味では、「SE語」は方言であり、悪く言えば
ソフトウェア開発の職場でよく発症する症状 奥が深い症候群 使いにくいツールに「奥が深い」と言ってのめり込む症候群。往往にしてもっとシンプルな解決策が他にある。 Tex、C++、Perl、Vim、Emacs、弊社フレームワークなどで発症しがち。 理由があるはず症候群 不合理(に見える)仕組みを見つけた時「こうなっているのにはきっと理由があるはず」と推測して、手をつけようとしない症候群。 実際には、 - 過去に必要だったが現在では不要になったものだったもの - 継ぎ足しで実装して複雑になってしまったもの - 原作者の無知によって誤った実装をしているだけのもの といった、特に理由なく不合理になっているケースも多く、こういったものは取り除くべきである。 また、理由があって変わった仕組みになっている場合も、「きっと理由があるはず」と推測するのではなく、作った人やドキュメントに当たって本当の理由を調べ
仕事でScalaで書いたプロジェクトを担当する機会がありました。 「Scalaは難しい」と時々言われます。 YammerがScalaからJavaへ移行中 matzとkmizuさんを中心としたscalaの複雑性についての話 私の感想は やっぱりScalaは難しい。 しかし、それはScala大好きな人たちが想像するのとはちょっと違うところ。 sbt が難しい いろいろありますが、とりあえず Ctrl+C で終了してしまう動作は、初心者の心をくじくと思います。 case が難しい match節の "case" は「『条件』に合う場合」という意味の "case" ですよね。 では case classは「条件に会う場合のクラス」 ??? どういうこと? 多分 case class のは「容器・入れ物」の "case"です。ですが、value class とか struct とか、別な名前にはできな
ランクA ~ コメントを読まなくても、関数名だけで使い方がわかる ランクB ~ コメントを読めば使い方がわかる ランクC ~ 中身を読まないと使い方がわからない ランクD ~ 書いた人の心を読まないと使い方がわからない(or 心を読んでもわからない) 元ネタ:[開発]ランクCのゴミコードを生産し続けないために、、、
転職して、Java(Jersey)とScala(Play)で書かれたWebアプリケーションをメンテを1年半ほどする機会があったのですが、Java系で特によく使われている(ような気がする) 「Controller / Service / Daoの3層に分ける設計」はアンチパターンであると思えてならないので、思っているところを書き出してみます。 そもそも「サービス層」「DAO層」とは何のことか MVCパターンには色々ありますが、私が疑問に思っているのは、 単にSQLを実行するだけの DAO層 DAOを呼び出して、ビジネスロジックを実装する サービス層 サービスを呼び出し、HTTPサーバーとしての振る舞いを実装する リソース層 という3層に分ける方法です。 *1。 # リソース層 class AccountResource { @Resource AccountService service;
書くのが楽しいプログラミング言語であるRubyですが、それでも「落とし穴」がいくつも存在します。 その中から私が最近ハマった落とし穴を7つ紹介します。 シンボルと文字列は異なる Rubyには「文字列(String)」("a" とか 'Hello world!')の他に、文字列に似た「シンボル(Symbol)」(:aとか:hello_worldとか)があります。*1。両者は異なる型なので、例えば 'a' != :a となります。 そのため、キーがシンボルであるハッシュ(Hash)から、文字列を使って値を取り出そうとするとnilが返されます。 h = { :ja => '日本語', :en => '英語', :fr => 'フランス語' } p h['ja'] # => nil p h[:ja] # => "日本語" ちなみに、シンボルはハッシュのキーとしてよく使われるため、=> を使わない短
RBENV_VERSION環境変数を指定すればいい。 #!/bin/bash RBENV_VERSION=2.2.3 rbenv exec rubocop "$@" 背景 イマドキ、プロジェクトで使うRubyのバージョンを.ruby-versionやGemfileで指定していない人はいないと思いますが、その時困るのはgem install hogeして使うRuby製のツール。 ツールは新しいRuby 2.2.xにインストールしたが、プロジェクトでは2.0.xを使っている、といった場合、rbenv は冷徹にエラーを出力します。 rbenv: rubocop: command not found The `rubocop' command exists in these Ruby versions: 2.2.2 2.2.3 そういった場合、最初の例のような内容のラッパースクリプトを書けばよござ
部分集合が含まれているのは仕様です。 1. リファレンスマニュアル 寝るときに枕の下に敷くこと。 なお、リファレンスマニュアルは各バージョンごとにあるので、最新版(今は2.2.0)を見ましょう。 オブジェクト指向スクリプト言語 Ruby リファレンスマニュアル (Ruby 2.2.0) 2. リファレンスマニュアル - 組み込みライブラリと標準ライブラリ ostructに(;´Д`)ハァハァしましょう。 組み込みライブラリ ライブラリ一覧 3. リファレンスマニュアル - 基本コレクション Enumerable#each_cons かわいいよ、 Enumerable#each_sliceも。 module Enumerable (Ruby 2.2.0) class Hash (Ruby 2.2.0) class Array (Ruby 2.2.0) class String (Ruby 2
wxPythonのサンプルのwx.lib.editor.Editorはwx.ScrolledWindowを継承して作られている。 wx.ScrolledWindowは、wx.Panelのサブクラスで、 右と下にスクロールバーが表示されるので、子コンポーネントをスクロール出来る。 (wx.Panelもスクロールバーを表示できるが、wx.ScrollBarの方がやりやすい) 自作のテキストエディタもwx.ScrolledWindowを継承することにする。 wx.ScrolledWindowは一見単独では使わなそうなので、 これを継承してテキスト入力欄を作るのは気持ち悪いが。 wx.lib.editor.Editorのソースから、行のスクロールの部分だけを抜き出すことにする。 小1時間ほど格闘。 理解できなかった。 wx.lib.editor.Editorでは、EVT_SCROLLWIN_LIN
イントロ 21世紀になって登場したフロントエンド向けビルドツールであるgrunt, gulpなどは、最近批判を受けているようだ。 【翻訳】Web世代のデベロッパーのためのmake - MOL 最近のビルドツールって何なの? - 檜山正幸のキマイラ飼育記 gulp問題ひきずり:ウォッチがまたおバカ過ぎる - 檜山正幸のキマイラ飼育記 たしかに、コンパイラ毎にプラグインをインストールしたり、毎年のように新しいビルドツールを覚えるのは無駄だ。古き良きmakeで十分という意見も理解できる。 でも、僕はmakeを使う気にもなれない。タブでインデントするのはまだ我慢できる。 しかし、$(JC) $(JCFLAGS) $< -o $@ といった記号を多用したソースは読みやすいとは言えない(可読性は大事だ!)。 また、機能がシンプルすぎて、標準的な使用方法から外れた時にはシェルスクリプトを苦労して書くこと
Dotenvは環境変数をファイル(.env)から読み込むためのRubyライブラリ。 Twelve-Factor Appなどでは、アプリケーションの設定は環境変数に格納することを推奨しており、Dotenvは本番と開発で環境変数を切り替えるのにうってつけ。 一方、開発環境で環境変数と言えばDirenv。 アプリにコードを追加する必要があるDotenvに比べ、Direnvはアプリと完全に独立して動作する! ここで、Dotenvのファイル(.env)をDirenvから読み込むことさえできれば、Direnvに完全移行できるじゃないか! と思ったら・・・なんだ、標準で入ってました、という話。 dotenv [dotenv_path]: Loads a ".env" file into the current environment http://direnv.net/#man/direnv-stdli
2015-05-09 読みにくい日本語ドキュメントを書いてしまう人たち ソフトウェア開発の仕事をして4年目になるのですが、未だに我慢できないことがあります。 それは社内ドキュメントが読みにくい日本語で書かれていることが多いということです。 ドキュメントの情報が古い、そもそも書かれていない、間違っているといった話ではありません(いや、この問題もあるんですが・・・)*1。 私が言いたい読みにくい日本語とは、書いた人が表現したい内容は理解できるし内容自体も間違ってはいないが、 曖昧だったり、主語がわかりづらかったり、ドキュメントにふさわしくない語尾だったりで読んでいてムカついてくる文章のことです。 読みにくいと思う日本語の例 勤め先のドキュメントを引用すると色々問題なので、Wikipediaから残念な例を引用します。 MySQLやPostgreSQLなど主要なRDBMSへの接続については、それぞ
Pythonの○○をGoで実装してみたシリーズ fileinputは、行単位で処理を行うコマンド(特にUNIXフィルタ)を作るときなどに便利なライブラリ。 import fileinput for line in fileinput.input(): process(line) コマンドライン引数で与えられたファイルの行に順番にアクセス 引数が空の場合は標準出力の行にアクセス ファイル名として '-' が与えられたときも標準出力の行にアクセス github.com 使用例 sc := fileinput.Lines(os.Args[1:]) for sc.Scan() { process(sc.Text()) // 行を処理 } if sc.Err() != nil { os.Stderr.WriteString(sc.Err().Error() + "\n") os.Exit(1) }
この記事は3.2まではPythonを使っていたが、しばらくPythonを離れ、最近戻ってくることになった人*1向けに、 3.3〜3.5で何があったか(何が起こる予定か)をまとめる記事です。 追加された新機能(基本文法・組み込みツール編) 3.3 ジェネレータの委譲のための新しい yield from 式 `u'unicode'`記法の復活 `venv`モジュールの追加 IOError, OSErrorの継承の階層が変更 クラス・関数に`__qualname__`属性を追加 3.4 なし 3.5 mypy による静的型チェックを標準サポート? 追加された新機能(ライブラリ編) 3.3 `ipaddress`モジュールの追加 `unittest.mock`モジュールの追加 3.4 `asyncio`モジュールの追加 `enum`モジュールの追加 `pathlib`モジュールの追加 `stati
1. イメージを作る方法はDockerfileだけじゃない Packerもある。 Packer by HashiCorp Packerは様々な仮想環境のイメージを統一的な方法で作れるツールで、Virtualbox・AWS・DigitalOceanなどにも対応しています。 したがって、DigitalOceanイメージとDockerイメージを1つのソースから作るといったことができます。 PackerはDockerの全機能が使えるわけではない(差分ビルドができない)のですが、 場合によっては問題にならないかもしれません。 2.Dockerイメージはtarで保存できる Dockerイメージをtarとして保存すれば、Jenkinsの成果物として保存したり、S3経由で配信したりできます。 tar出力するにはdocker exportを使います。また、packerはデフォルトではイメージをtarで出力し
ソフトウェアを開発するためのプログラミング言語には様々な種類があり、 歴史あるもの新しいもの、手軽さを重視したもの厳密さを追求したもの、など様々な種類があります。 ここでは、8種類のプログラミング言語を、それぞれお昼ごはんに例えてみました。 どれもとても美味しそうですね。 アセンブラ ウサギ。まず血抜きの処理から始まる。 C言語 昔はこういうのを食べていた。 Python 色とりどりのおかずは栄養バランスがよく、持ち運びにも便利です。 Java (Version 1.5) 栄養バランスがよく、持ち運びにも便利ですが・・・ PHP ハンバーガーセット。たまに食べる分には手軽で旨い。でも毎日はちょっとね。 Go ステーキ定食。そうそう、こういうのでいいんだよ、こういうので。 Haskell マナーに厳しいおフランス料理店のフルコース。味は絶品だけど、フォークの上げ下げにも一々注意され、 メイン
これはElm Advent Calendar 2014の14日目の記事です。 AngularJSのチュートリアルをElmで再実装してみました! doloopwhile/elm-phonecat · GitHub まだ、本体のソースコードだけで、解説は何もないのですが・・・。 書いていて、気づいた事を、良い点・不満点それぞれ3つずつ書いていきます。 良い点1:必要な機能が十分に実装されている Elm v0.14ではJson.Decoderが追加され、JSONのパースを実用的な記述量で実装できるようになりました。 私にとってはこれがAngularJSのチュートリアルをElmで再実装する上での「最後のピース」でした。 もちろん「ウチの業務アプリをElmで再実装してよ」と言われると「いやAngularJSの方が・・・」となります。まだElmには荒削りなところもあります。 しかし、「オモチャ」と言わ
これはElm Advent Calendar 2014の6日目です。 Elmの優れた点と言えば、 Haskellベースの静的型関数型言語 Functional Reactive Programming 強力なレイアウト機能 などがまず挙がるでしょう。しかし、 図形描画ライブラリ も、実はElmの長所の一つなのです。 Elmの図形描画機能 まずは 公式サイトの例をご覧ください。 HTML5のCanvasは、JavaScriptによる手続き型の実装を前提にしていたので、コマ毎にclearRectで消去したり、save/restoreで状態を管理したりする必要がありました。プログラマーはともかく、「学校で習った図形を書いてみよう」と言う場合にはやや非直感的です。 一方Elmでは更新処理自体はElmがやってくれます。 また、図形はFormという「図形そのもの」を表す型として、 図形の移動や拡大縮小
これはElm Advent Calendar 2014の3日目です。 ElmはHaskellベースの言語なので、Haskellの記事や入門書もElmの学習に使えます。しかし、実はElmにはチョコチョコHaskellと違うところがあって互換性はありません。 相違点をElm公式サイトLearnの SyntaxとFAQから抜粋して解説します。 1. Elmは遅延評価ではありません Haskellは遅延評価なのでリスト処理の効率が良いのがウリでした。 JavaScriptにもジェネレータという形で遅延評価の思想が取り入れられています。 しかし、Elmのリストや辞書等などは遅延評価ではありません。 Elmはクライアントサイドの言語なので、遅延評価があまり役立たないこと、 SignalがJavaScriptのジェネレータのような機能を持っているためのようです。 2. Elmにモナドはありません Sig
ElmはPlaygroundで簡単にコードを試せますが、最終的にはelmコマンドでコンパイルする必要があります。 0. バイナリをインストール MacとWindowは、公式サイトのInstallから、 バイナリをダウンロードできます。 しかし、LinuxではHaskell Platformを使ってソースからインストールしなければなりません。 1. Haskell Platformのインストール Haskell Platformはapt-getなどでインストールできますが、古い場合があるので新しくインストールした方が良いかもしれません. cd / curl -L https://www.haskell.org/platform/download/2014.2.0.0/haskell-platform-2014.2.0.0-unknown-linux-x86_64.tar.gz | sudo
バズーカが弾切れ、絶対絶命のピンチ、メガネの小悪党がmain関数を実行する前に実行ファイルを削除したいというのはよくあることです。 使用例 たとえばこういうコードに・・・ // get.go package main func main() { println("ハハハハハ!飛行石を手に入れたぞー!!") } importをくわえるだけで・・・ // get.go package main import ( _ "github.com/doloopwhile/go-balse" ) func main() { println("ハハハハハ!飛行石を手に入れたぞー!!") } たったこれだけでバルスします! $ go build get.go $ ./get panic: _人人人人人_ > バルス!<  ̄Y^Y^ Y^Y^ ̄ goroutine 16 [running]: runtime.
これはElm Advent Calendar 2014の1日目です。 Elmはクライアントサイド向けの関数型言語です。一体どんな言語なのでしょうか? 1. HTML/CSS/JSにコンパイルされる ElmはHTML/CSS/JSにコンパイルして使用します。 この辺はJavaScriptにコンパイルされるAltJSに似ています。 AltJS同様、Elmも特別なランタイムライブラリは不要です。 ただし、Elmは1つのソースでHTML/CSS/JSをすべてまかなえるのが特徴です。 2. 独自の抽象化レイヤーを提供している 代表的なAltJSであるCoffeeScriptは"It's just JavaScript"をモットーにしています。すなわち、文法を改良するのみで、「中身」はJavaScript以上でも以下でもありません。 一方、Elmでは直接JSやCSSを操作することはできません。 基本的
2014-11-24 なんちゃってライブラリがそこそこ使われだしておっかないと言う話 Python JavaScript 今月に入って doloopwhile/PyExecJSに連続してPull RequestとIssueが3件も飛んできて驚いています。 PyExecJSはJavaScriptのコードをPythonから実行するためのライブラリです。 といってもPyV8のようにJSエンジンのラッパーではなく、 PATH からSpidermonkey、Node.js、PhantomJSなどのJS実行環境を検索して、 susprocess.call経由で呼び出すといういい加減な方法を取っています。 当然、速度は出ません。 PyExecJSはもともと3年ほど前に、Rubyのsstephenson/execjsというライブラリをPythonに移植したもので、 「Rubyにはあって、Pythonには無
2014-11-09 用語の本質は市場原理である 「リファラ偽装」という用語の筋の悪さに、ついカッとなって「リファラ偽装」を使わずにリファラとCSRFをまとめ直す - None is None is Noneという記事を書いてしまったので、ついでに「用語はだれが決めるのか?」「用語はどう使うべきか」も書こうと思います。 用語は個々人が勝手に定義するもの 昔、冥王星が惑星から外される、というのが話題になりましたね。国際天文学連合が冥王星が含まれない形で「惑星」という用語を定義したのです。 あれは実は科学の世界では例外的なことです。というのも、普通は科学用語を国際機関が定義したりはしないのです。 個人的なエピソード。大学2年生の代数学で長尾汎の「代数学」という本が教科書でした。 代数学 (新数学講座 4)作者: 永尾汎出版社/メーカー: 朝倉書店発売日: 1983/01メディア: 単行本購入:
goreの説明を追記。 LLから、Goに移るときの不満の一つに「標準のREPL(インタラクティブシェル)が無い」があります。 「ポインタはmapのキーになるんだっけ?」のような、つまらない(けど、ありがちな)疑問を解消するには、ドキュメントを漁るより、コードを書いてしまう方が、手っ取り早いですよね? goplayを作った! goplayは、書捨てGoコードを書くためのシンプルなツールです。 やっているのは、 1. 一時ディレクトリを/tmp/goplay/以下に作る 2. main.goを一時ディレクトリに作る 3. 一時ディレクトリで新しいシェルを起動 4. 環境変数GOPATHに一時ディレクトリを追加。 これだけです。 インストールはgo getするだけです。 go get github.com/doloopwhile/goplay 他の方法との比較 ちゃんとしたREPL(gore)を
mainパッケージに変数を埋め込みたいとき Goで作ったアプリで --version 用にバージョン番号とビルド日時を埋め込みたい。 そんな時、-ldflagsを使えばいいのはwell-knownだと思います。 go build -ldflags=" -X main.compiled 'ビルド日時' -X main.version 'バージョン番号' " . サブパッケージに変数を埋め込みたいとき では main以外に変数を埋め込む時は、どうすればよいのでしょうか? ui/backend/workerの3つのサーバーからなるシステムを作っているとします。 3つのmainパッケージがopts(コマンドラインパーサ)パッケージを共有しています。 バージョン番号はui/backend/workerで同じ番号を使いたいので、optsに埋め込みたいと思います(3つのmainそれぞれではなく)。 この
プログラマーは往々にしてCUI世界の住人なのですが、 ごくたまに、ファイルをドラッグ&ドロップで指定できると便利、ということがあります。 doloopwhile/dap · GitHub スクリーンショット インストール go get github.com/doloopwhile/dap 使い方 ドラッグアンドドロップでファイルをバックアップ・ディレクトリにコピーする mkdir -p $HOME/backup dap | xargs cp {} $HOME/backup なぜ作ったか Debian系OSには(dragbox)https://packages.debian.org/ja/sid/dragboxというツールがあるようです。しかし、どういうわけか私のXubuntuでは動きませんでした。 そこで、(Go-GTKのD&Dの例)https://github.com/mattn/go-
小さなGoライブラリをつくった時、ほとんど自分しか使わないような規模なら、わざわざREADMEに「Usage」「Example」「Functions」なんて書くのは面倒ですよね。 そんな時は、godocdownで自動生成してしまうのがオススメです。 godocと同等の内容をGitHub用Markdownで生成してくれます。 例:doloopwhile/go-merror · GitHub go get github.com/robertkrimen/godocdown/godocdown godocdown > README.md まぁ、わざわざgodocdownでREADMEを作らなくても、 ほっておいてもgodocは、自動で生成されるのですが、READMEを空っぽにしておくのも寂しいので。
次のページ
このページを最初にブックマークしてみませんか?
『None is None is None』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く