サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
ブラックフライデー
cs.hatenablog.jp
AltJava言語(特に手続き型のBetter Java言語)では3年前からCeylon推しだったんですが、Kotlinにはかなわなかったなーと負けを認めてKotlin勉強会に参加してきました。 ちなみに同時期、AltJS言語としてHaxeを推してたけどこれもその後の流れはTypeScriptの完全勝利っぽくて自分の目利きのできなさにウケるんですけど、CeylonとHaxeがこれまた雰囲気似てる言語で苦笑するしかないです。 Sansanさんのオフィスかっこいい 同じく渋谷宮益坂のビズリーチさんところも渋谷Javaで何度かお邪魔していますが、あそこもオフィスかっこいいし、渋谷すごいですね(小並 乾杯で勉強会スタートだ メインゲストのたろうさんのご意向もあって🍺片手の勉強会となっていました。懇親会じゃなくて本体が乾杯で始める勉強会って初めて。Sansanさんごちそうさまでした。 Kotlin
DBの主キーカラムに自動連番(MySQLならAUTO_INCREMENT、SQL ServerならIDENTITY、OracleやPostgreSQLならシーケンス)を設定していると、基本的には連続した数字が付番されていくのですが、行削除もしていないのに抜け番が発生する場合があります。 INSERTが制約にひっかかって失敗した トランザクションをロールバックした などの場合です。 特にトランザクションのロールバックは、DB全体の変更をなかったことにするはずなのに連番だけは進んだまま戻らないということで、知らないと違和感があるものです。 連番が戻らない理由 PostgreSQLのドキュメントがこう説明しています。 同一のシーケンスから数値を取得する同時実行トランザクション同士のブロックを防止するため、nextval演算は決してロールバックされません。 http://www.postgresq
一意性(UNIQUE)制約はNULLでない値に対してだけ効く、そう思っていた頃が私にもありました… SQL ServerはNULLも一意性制約の対象になります。NULLになっている行が複数あると重複だと判定されます。SQL-92の規格書をあたってみると、これは完全な規格違反なんですけどね。 A unique constraint is satisfied if and only if no two rows in a table have the same non-null values in the unique columns. http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt つまりSQL Serverじゃ以前解説した 有効なレコードだけに一意性制約をかける が使えないってことです。 でも大丈夫。 SQL Server
先に結論。DEFERRED, DEFERRABLEという単語を覚えてお帰りくださいませ。 そして先にごめんなさい。SQL ServerとMySQLはDEFERRED, DEFERRABLEを未サポートですのでこの記事の内容は使えません。 さて話のはじめから。 こんな条件のデータを格納したくなったとしてください。 顧客は担当者をもつ。 歴代の担当者が複数いるかもしれないが、現在の担当者が必ず一人いる。素直にER図で書くとこんな感じ。 テーブル同士が外部キー参照し合っています。あれ、そんなことできるんだっけ? というお話です。 お互いに外部キー参照する 実際書いてみましょう。 -- 顧客 create table 顧客 ( 顧客ID INT NOT NULL PRIMARY KEY , 法人名 VARCHAR(64) NOT NULL , 現担当者ID INT NOT NULL , CONST
先週から話題のこちらのプログラミング課題 新人女子プログラマの書いたコードを直すだけの簡単なお仕事です!|paizaオンラインハッカソンVol.1 アプローチの仕方はいろいろあると思うのですが、新宿Scala座主宰のid:numanuma08氏は「Scalaだったらリストからすべての組み合わせを生成するのもcombinationsメソッドで一発だよ」といつも通りScala全力押しです*1。 ところがその紹介の最後で C#もLinqとか使えばいけそうな気がします。 #新宿Scala座 で新入女子社員を救ってきた 今煽られました。 完全に煽られました。 LINQとやらで組み合わせ列挙書いてみろよほら張り子の虎とか笑わないからさと煽られました。 書いてやろーじゃねーの。 課題の整理 次のようなリスト {2, 3, 5, 7} から2つ組をと指定されたら { {2, 3}, {2, 5}, {2,
本日twitter上でエンジニアの間で話題になった問題。 4択問題10問のテストを全部埋めて提出すると正解数がわかります。 何回提出すればすべての正解を知ることができますか。10問すべての正解は、最大16回の試行で知ることができます。 (2014-06-20追記:これは算数の範囲内での答なのですが、算数の範囲内でもさらに改善できました。14手です。 http://cs.hatenablog.jp/entry/2014/06/20/132605 ) まず、回答の分布がわからない場合の最大 = 21回 1問目の正解を知るためには最大何回試行する必要があるでしょう。 AAAAAAAAAA BAAAAAAAAA CAAAAAAAAA DAAAAAAAAAの4回必要だと思いますか? いえ、3回で十分です。 AAAAAAAAAA BAAAAAAAAA CAAAAAAAAAこの3回の正解数が同じだった時
タイトルの通り、PostgreSQLではテーブル名、カラム名など識別子に英大文字を使うべきではありません。 PostgreSQLは命令中の識別子を読み取るとき、二重引用符でくくられていなければ大文字を小文字に正規化します。その上で大文字小文字を区別して認識します。 その結果、 # PgAdminでUsersテーブルを作る # ツールはちゃんと二重引用符でくくるのでそのままの名前でテーブルができる # コード内でselect id, name from Usersなどと書くと、code>select id, name from usersと解釈されてしまいテーブルが見つからない などという馬鹿馬鹿しい事故が起こることになります。 手書きでSQLを書くならまだしも、O/Rマッパーが絡んだりするとや闇要素でてきますね。 複合語はキャメルケースでなくアンダーバー区切りで書くことになりますね。
secureクッキーは、HTTPSを使っていない場合にはブラウザからサーバに送り返されないフラグを付けたクッキーのことです。 秘密情報をクッキーに乗せて覚えさせたのに、うっかりさんユーザーがHTTPでアクセスしてきてクッキー内容がパケット盗聴で漏れるとかもうダメダメパターンですからね。 Play! frameworkでHTTPSを使うサイトなら、application.confに session.secure=trueの一行を加えて、セッション情報を格納するクッキーには必ずsecureフラグが付くようにしてあげましょう。 ところが問題が。 この設定があると、HTTPではログインとかまったくできなくなります。開発機の開発サーバでも。デバッグできないじゃない。 開発機だけapplication.confを入れ替えるとかそういうのはソース管理が単に面倒になるので避けたいですね。 でも簡単、開発サ
注意 追記 2014/03/17この記事で紹介した問題回避方法は処理系依存かもしれません。Windows版JDK7(Oracle)のクライアントモードJVMでは意図通りに動作したもののLinux版JDK7(Oracle)のサーバモードJVMで依然として問題動作(WSDLを実行時に参照してしまう)が見られました。詳しい検証ができていませんが、この技法を利用する場合開発環境・動作環境両方でのチェックをお願いします。JavaでWebサービスのクライアント作ろうと思うと、フレームワークとしてはAxis2かJAX-WSを選択することになると思います。といってもJDKに標準でJAX-WSがついてる以上わざわざ外部ライブラリ増やしてまでAxis2というのも今さら考えにくいです(Axis2は自動生成されるコードがコンパイル時警告の出まくるものなのもイヤな点)。 さてそのJAX-WS、控えめに言ってもとても
こんなスキーマ設計を見ました。 CHECK制約で排他的サブタイプを実現する - pikio公式ブログ オブジェクト指向のプログラミングでは、クラスを継承してサブクラスを作ることはよくあります。そして、アプリケーションではデータを複数のサブクラスに分けて扱っているのに、それを格納するデータベースでそのデータ構造をうまく表現できないなんて悩みにはわりとよく直面します。 一部RDBが持っているテーブル継承機能がそれっぽいんですが、親テーブルと子テーブルで主キーの一意性制約がかけられないなどいまいち実用性に欠けます。 では親クラス(例えば【従業員】)で主キーの一意性を保証したまま複数のサブクラス(例えば【正社員】【アルバイト】)を格納するにはどんなスキーマを設計すればいいか。 これには定石が2つあります*1。 シングルテーブル継承 … 「従業員」テーブルを作り、正社員用のカラムもアルバイト用のカラ
C#はラムダ記法で無名関数が書けますし、Javaも8からラムダ記法が可能になりました。 しかし無名関数では再帰関数が書けません。 さてどういうことか。 再帰関数の代表選手として階乗計算を例にとってみましょう。 まず、メソッドとして再帰的に書いてみます。 int Pow(int n) { return (n > 1) ? n * Pow(n - 1) : 1; } こうですね。では、これをラムダ記法で書こうとすると… Func<int, int> pow = n => (n > 1) ? n * 【ここに書くメソッド名がない!】(n - 1) : 1; そう、自分自身を呼ぼうにも自分自身は無名だから呼びようがないのです。困りました。 Javascriptを使う人は「arguments.calleeを使えばいい」と思うかもしれませんが、Javascriptだってもうarguments.call
AngularjsはJavascript(以下JS)でリッチクライアントを書くためのMVCフレームワークです。JS MVCフレームワークはいま混戦状態で決定版はどれといいにくい状態ですが、確実に三強の一角ぐらいは占めていますね。 Angularjsについてもう少し知りたい場合はこちらのプレゼンテーションなどを。 Angular.jsのここがアツい!! さてそのJSは、今となっては人手でコーディングするには生産性が低すぎるから別のもっと良い言語からコンパイルして生成するようにしようぜという流れになっており、その「別のもっと良い言語」のことはAltJSと総称します。Haxe(ヘックス)はその代表格、その他にもCoffeeScript、TypeScript、Dart、JSXなどいろいろ個性ある言語がひしめいています。 当然、Angularjsを使ったアプリケーション開発でも、コード部分はJSでな
GitBucketは驚きの超お手軽GitHubクローンです。 そのお手軽さたるや、落としてきたgitbucket.warファイルをTomcatにデプロイするかjarとして実行java -jar gitbucket.warするかするだけで社内GitHubがもう構築完了。 あとはrootユーザ(初期パスワード root)でサインインして自分のパスワードを変えるだけでもう実使用可能な状態になっています。 そのGitBucket、社内の開発者全員分のユーザアカウントを各自に作ってもらうまでもなくActiveDirectoryの認証情報でサインインするように設定することが可能です。手探りでやってみて設定に成功したので、方法を解説します。 1. 社内のドメインコントローラのホスト名を確認します システム部門に聞けばもちろん一発なのですが、ドメインに参加しているWindows端末なら手元ですぐ調べられま
HaxeはActionScriptをベースにした汎用言語だが、Javascriptへのコンパイルが当初から実現されているのでBetter JSのひとつとしても人気。 実験的にJava, C#, C++へのコンパイルまでサポートされている。 特徴としては、強力な型推論を持ったクラスベースのオブジェクト指向言語。 型システムの拡張性が高く enum型が、単なる列挙体というよりは共用体、いや、OptionやEitherがそのまま書けてしまう合併型と呼ぶべき存在。 構造的部分型と呼ばれる、持っているべきメソッドの集合によって表現された型がある。ダックタイピング型でありinterfaceと違ってクラス側が“実装”する必要が無い。GCC版C++のSignatureに近いが、Signatureと違ってその場で書けるから柔軟性はより高い。Scalaにもあるやつです。 福岡方面でひんぱんに勉強会やってるらし
2年前につぶやいた内容の詳しい説明。 32ビット整数をとりあえずスクランブルするすごく簡単な方法に気付いてしまった。なにか奇数をかけると、それにかければ元の数に戻るような奇数が必ずひとつあるから、それを力任せで見つけてしまえばいいんだ。ビット回転→奇数をかけるを3回繰り返すとほぼバラバラ。— ゆば大好き (@yuba) October 18, 2011 整数を、暗号ライブラリ使うほどじゃないんだけどスクランブルしたいことってあるんですよね。たとえば、IDを連番で振ってるんだけど連番だってことがユーザーにわかってしまうと具合が悪いとか。そういうときの簡単なスクランブル方法です。ただし、符号なし整数でしか使えないのでこの時点でJavaは対象外ごめんなさい。 まず32ビット整数版のC,C++,C#で動くコードです。 uint Scramble(uint v) { // 奇数その1の乗算 v *=
もしくは、「Iterable<Number>にIterable<Double>を代入したいっ!」。もしくは「ガチで5分で理解できる共変・反変」、どれでもいいです。同じことです。 どういうことかというと NumberとDoubleに親子関係があったときにIterable<Number>とIterable<Double>にも親子関係が発生することを共変関係と呼び(逆の親子関係が発生するなら反変関係)、Javaで共変関係を生かしたままジェネリッククラスを扱う道具がワイルドカード総称型です。 はい、わかったようなわからないような説明ですね。 実務でありそうな例を見ながら書いていきます ファクトリとプロダクトのインターフェース(Factory, Product)があったとして、それに実装クラス(FactoryImpl, ProductImpl)を書くとします。ファクトリの機能として、作成済みプロダク
Play framework 2.x Java and 1.x Advent Calendar 2013*1の20日目(5日ぶり4回目)です。 寄稿予定表をみると、明日担当のgakuzzzzさんの内容とかぶってしまっている可能性がとても高いのですが、Play1とPlay2の違いがあるので許してもらえないものでしょうか。 さて、JavaEEにもPHPにもASP.NETにもあるのにPlay! frameworkにはないものはと問われれば。 セッションですね。アクセスしてくる閲覧者を識別して、閲覧者別にデータを保持できる容器です。Play!にはこれがありません(ドキュメントにはセッションと称する機能の記載がありますが、これは一般には一時クッキーと呼ばれるものです)。 Play!のキャッチフレーズ「ステートレス」というのがまさにセッション機能を持たないことを意味しています。機能が欠けていることが特
Play framework 2.x Java and 1.x Advent Calendar 2013*1の15日目(4日ぶり3回目)です。 Play! 2.1(Java)で作り始めたWebアプリなのですが、まだ作り始めたばっかりのうちに2.2系列のPlay!が出て来たので、どうせなら今のうちにと乗り換えを敢行しました(BoneCPのコネクションリーク問題が解決したバージョン0.8.0が、Play! 2.2.1でやっと標準搭載されたからというのが直接のきっかけです)。 結論から言うと乗り換えはできたのですが、設定ファイルの名前も書式も変わっているなど一本道ではなかったので覚え書きをここに。 どうやって作業したかと言いますと、2.1と2.2とでそれぞれplay newして、できあがったプロジェクトディレクトリを差分取って差分を今のプロジェクトに反映して(手動)などとやっておりました。 設定
Play framework 2.x Java and 1.x Advent Calendar 2013*1の11日目(5日ぶり2回目)です。 さて、法人向けクラウドサービスを提供するときに問題となる、顧客ごとのデータの分離についてが今日のトピックです。 個人向けのWebサービスであればすべての情報は1個のスキーマに放り込まれて、データアイテムは外部キー関連でログインIDと結びついているものです。ところが法人向けではそうはいかない。何かの間違いである顧客企業のデータが他社の画面に表示されてしまう事態は万が一にもあってはならないし、そもそものセキュリティ内規とか外部団体の規約とかで「独立保存されていること」が要件となっていたりします。 そこでデータの分離の話。 顧客データ分離レベル 顧客データの分離の仕方については、ここで説明するよりマイクロソフトの出してる白書を読んでしまいましょう。これで
Play framework 2.x Java and 1.x Advent Calendar 2013*1の6日目です。 お題は、Lombokを使ってPlay2 Javaのユニットテストを書きやすくできますよという話。 ケース Play2 Java使っている方なら当然、永続化はEBeanですよね。そうでしょうそうでしょう。では、例としてこんな感じのテーブル CREATE TABLE items ( id serial NOT NULL PRIMARY KEY, name text NOT NULL ); を、こういうエンティティクラス @Entity @Table(name="items") public class Item extends Model { @Id @NotNull public Integer id; @NotNull public String name; } でO
Wikipediaの記事を読んでもよくわからなかった人のために。 「5分で理解する」というタイトルにしようと思ったんですが書いているうちに5分は無理だなと悟りました。20分ください。 IEEE1888とはなんなのか IEEE1888は建物のエネルギー管理機器類がデータをやりとりするために作られた共通規格です。しかしその中身は時刻ラベルつきのデータ(文字列)を書き込むか読み取るかするだけというシンプルなもので、時系列のデータを扱うのならエネルギー管理でなくてもなんでもいいという柔軟なものです。金融情報にも渋滞情報にも使えてしまうんです。 BEMS でもエネルギー管理の話に戻って。 ネット越しに温度いじれるスマートな空調機器ですとかネット越しに電力を見られるスマートな電力計ですとかをビル内に配置してシステムで集中管理してビルの電力消費を最適化しようじゃないか的なソリューションはいろいろなところ
コンストラクタが特に何もしてくれず、インスタンス作ってから初期化しないといけないタイプのクラスってありますよね。シリアライズのためだったりJavaBeansだったり、あとはふつーのArrayListだから作ってから内容詰め込みます、みたいに。 オブジェクト作ってreturnしたいだけなのに、作ったあとに初期化しないといけないから一時変数作るのがいつも一手余分で、一行で書けるラムダ式がブロックラムダになったりするといらいらもたまるというものです。 C#にはオブジェクト初期化子があるのでその余分な一手が省けますね。 return new Person { Name = "Alice", Age = 20 }; return new List<int> { 1, 1, 2, 3, 5, 8, }; return new Dictionary<int, String> { { 200, "OK"
モナドを理解した人がまだ理解していない人になんとか理解してもらおうと書く解説記事ばかり積み上がっていくのはもはやIT系ブログ界の伝統芸ですが、この記事で少しでも貢献になるでしょうか。 この記事ではHaskellも関数型言語も出て来ません。読み慣れた手続き型言語でIOモナドがどういうものか読み解いていきます。 関数プログラマが避けたいこと=不確定さ 解説の前にまず例題を決めましょう。例題は「現在時刻を表示するプログラム」とします。簡単ですね。ちょっと書いてみましょう。 // Javaの例 Calendar now = GregorianCalendar. getInstance(); DateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); System.out.println(formatter.format(n
CodeIQの問題・パズルを考えよう!(by CodeIQ×はてな) ある湖の貸しボート屋が古いボートを処分しようとしましたが何艘残せばいいかわかりません。 貸し出しリストから、ピークのときに何艘が貸し出されていたかを求めたいです。 貸し出しリストは 貸出日時, 返却日時, ボート番号の組になっており、貸出日時の順に並んでいます。 このリストを一回だけスキャンして(ランダムアクセスすることなく)ピーク貸出数を算出してください。(2013-08-25 制約が曖昧だったので書き直しました) このリストからピーク貸出数を算出してください。 リストは膨大なサイズなのでメモリに収まることは期待できません。1回のシーケンシャルアクセスで解決してください(ボートの数はたかが知れているので、ボートの数に比例する程度のメモリを使うことは問題ありません)。 ただし、同一時刻に返却と貸出があった場合、それらの貸
CodeIQの問題・パズルを考えよう!(by CodeIQ×はてな) 5リットルのバケツ(A)と3リットルのバケツ(B)だけ使って4リットルの水を測れと言われたら Aを満タンにする Aから注げるだけBに注いで、終わったらBの水は捨てる(Aに2リットルたまった) AからBに2リットルの水を移す Aを満タンにする AからBに注げるだけ注ぐと、Aに残るのは4リットル これで最短手筋でしょうかね!? (人力での解き方)5Lと3Lのバケツで4Lの水を作る問題・人力で解く編 - C Sharpens you up はい、これを解くプログラムを書いてください。 問題は バケツ容量はx, y(整数) 目標量はz(整数)で与えられます。 許される操作は どちらかを満タンにする どちらかを空にする 一方から他方へ注げるだけ注ぐ のどれかです。 問題に対する結果として、 手筋があるなら、操作を順序通りに返してく
Windowsでシンボリックリンクを作るときは mklink 【作るリンク】 【実ファイルパス】で、UNIXでシンボリックリンクを作るときは ln -s 【実ファイルパス】 【作るリンク】なので引数の順番が逆ですご注意*1。 あと、mklinkでは/Hをつければハードリンクで、デフォルトならシンボリックリンクですが、lnでは逆、-sをつけたらシンボリックリンクでデフォルトならハードリンクとなります。 さらに、Windowsではファイルのシンボリックリンクとディレクトリのシンボリックリンクが区別されています。ディレクトリへのリンクは/Dオプションを付けて mklink /D 【作るリンク】 【実ディレクトリパス】です。ディレクトリ相手に/Dを付け忘れてファイルシンボリックリンクを作ってしまうと何の役にも立たないおもしろリンクができるのでご注意。 そのディレクトリ相手のリンクについてはWind
納涼!ほんとにあった怖いコード(by CodeIQ×はてな) ある夏体験した悪夢のようなコーディングの話です。 そのソフトは、もともと1本のプログラムでクライアントとしてもサーバとしても機能するという作りになっていました。 そのソフトに転機が訪れます。 サーバ・クライアントを別々のプログラムに分離することに、さらにはサーバ側はWindowsサービス(UNIXで言うところのデーモン)とUIプログラムに分離することに、つまり都合3本のプログラムに分けることになったのです。 担当していた開発者はそれをソース分岐ではなく、あくまで単一のソースで実現しようとしました。C++の #IFDEF マクロを使い、コンパイルオプションに従って各プログラムで必要な部分だけがコンパイルされるように、文字列リソースはそれができないのでプロジェクトごとに別ファイルを参照するようにして… それを30プロジェクト、500
Windowsでコマンドライン操作が必要なとき、わざわざスタートメニューからコマンドプロンプトを探して起動しておられる方はまさかおられませんな。 基本操作【フォルダをSHIFT右クリック】→【コマンドウィンドウをここで開く】 はもちろんのこと皆様使っておられるだろうというのは前提として… もっと簡単な方法。 アドレスバーにcmdと打ち込む これでエクスプローラで開いているフォルダをカレントディレクトリにしてコマンドウィンドウが開きます。 アドレスバーにplayと打ち込む Play!をインストールしてPATHが張られているなら、これでPlay!プロンプトも一発起動です。
Play!のJava向けO/RマッパーであるEbeanはコンパイルに介入するタイプのフレームワークです。 具体的には、Ebeanモデルがコンパイルされたあとに、getter/setterを勝手に作成して埋め込んでくれます。これが、単にpublicフィールドを書いただけで遅延アクセスをやってくれる仕組み。 ところが、IntelliJやEclipseのJUnitプラグインはそこら辺の事情を知らないので、テスト実行時に自力でコンパイルし、ただのJavaオブジェクトにしてしまいます。そしてこける。 "It has not been enhanced" というランタイム例外が飛びます。enhanceってのがそのgetter/setter生成動作のことですね。 JUnit実行のたびにplay cleanしてplay compileしなおすとかたるくてやっていられないのでJUnitプラグインに正しいEb
次のページ
このページを最初にブックマークしてみませんか?
『C Sharpens you up』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く