プログラムをやっていればすぐに理解できる仕組みですね。ちなみに平均は合計を件数で除したものです。以下のコードは、上記の動きを表すため、Javaで作った模擬的なコードです。0)がwhere句だと考えてください。avg)のようなwhere句が使えないことは自明ですね。APIを使用して、半径のリストからその面積を表示するプログラムの例を示しました。今回はリストの要素の偶数だけの合計値を求めてみます。sum);非常に簡潔に記述できます。APIを使用できません。どのようにすれば同等のことが出来るかを示します。リストの要素が集計の対象であることを判定する抽象メソッド(filter)をもったインタフェースを用意する1.のインタフェースを実装した具象クラスを用意する。}}上記リストのmainメソッドでテストしています。APIを使用した場合よりも用意するものが多く、煩雑に見えますが、面白い解き方であると個人的には感じています。API5月7日のPythonの内包表記をJavaのStreamを使うと以下のように書けます。Javaの記法は煩雑だと敬遠される時期もありましたが、やっと追いついてきた感じです。【Python】リストの内包表記Pythonの内包表記は簡潔で強力なコレクションクラスの生成方法です。半径のリストからその面積のリストを生成し表示するスクリプトです。非常にスマートな記述になります。【Java】サーバ移転時のジャンプサーバの移転などでドメインを変更した場合、古いドメインからいきなりジャンプすると、ドメイン名が変更されたことにユーザが気付くことが出来ません。直接的な対処方法としては、「10秒後に新しいサイトに自動的にジャンプします」などのメッセージを表示して、新しいドメインにジャンプすることです。この方法であればユーザはドメイン名の変更に気付くことが出来、ジャンプ後のURLをブックマーク(お気に入り)に登録しなおしてもらうことが出来ます。今ではJavaScriptで行うことが多いと思いますが、サーバサイドの言語でも可能です。以下はJSPを使ったサンプルコード(スクリプトレットのみ)です。【Python】高階関数JavaやC#と違い、Pythonの関数はもともと第1級関数であるので、関数の引数として関数を渡したり、戻り値(返り値)と関数を返すことも可能です。したがって、C#でデリゲートを使ったプログラムも以下のように簡単に記述できます。【C#】lambda式4月28日のデリゲートをラムダ式に置き換えたサンプルです。メソッド定義すら要らなくなります。【C#】DelegateC#独自の機能というわけではありませんが、デリゲートという仕組みがあります。メソッドの引数構成や戻り値が同じであれば、デリゲートに代入し、同じような処理にロジックを注入できるという仕組みです。以下は配列に存在する数を集計するプログラムです。スマートな解き方が既にC#にはありますが、デリゲートを理解するのに適したサンプルだと考えています。単純に集計をするだけならばデリゲートは不要ですが、配列からある条件を満たしたものを集計したい場合、条件式だけが変化することに気付けば、その条件式のロジックをデリゲートを介し集計(Sum)メソッドに注入することが可能です。デリゲートのおかげで似たような集計メソッドを作る必要がなくなります。ラムダ式を使えばとか、Linqを使えばとかご指摘はあるかと思いますが、あくまでデリゲート理解としてのサンプルです。【Python】Dictionary型PythonのDictionary(辞書)型は、JavaではMap、JavaScriptやPHPでは連想配列、RubyではHashなどと呼ばれます。キーが分かれば瞬時にそれに紐づく値を引き出せるという優れものです。プログラム言語には欠かせないもので、Dictionary型をいかに使いこなすかが初級コースの目標の一つでもあります。非常に便利なものではありますが、キーはイミュータブルなオブジェクトでなければならないことに要注意です。値が決まったら、それ以降絶対値が変更できないという性質を持っていなければなりません。そのオブジェクトが持つ値を元にハッシュ関数が、キーに紐づく値となるオブジェクトのメモリのアドレスを求めるからです。したがって、オブジェクトを不変に保てるような値がキーとして好まれるため、文字列や整数値が使用されることが多くなります。Pythonも他の言語と同じように作るのはいたって簡単です。以下のコードは曜日の英和辞書を和英辞書に変えるスクリプトです。【SQL】絞り込み後のグループ化でグループが欠落することを回避する方法(別解)11月23日のSQLの問題はあくまで解き方の1つです。他にも方法はあります。1年ほど前に他の生徒さんと考えたSQLは以下の通りです。これも面白い解き方ですね。技巧的ですが、自分の頭で解いているなと感じられます。以下のような地域テーブルがあります。この中から支店名に「カフェ」つく店舗が地域ごとにいくつあるかを求める問題です。483参考書の答えは以下の通りです。2このような解答で業務要件を満足すればそれでいいでしょう。この解答では、地域2と地域4のほかにどのようなグループがあるのかが明らかではありません。2生徒さんと一緒に考えた答えは以下の通りです。カフェがつく支店がないグループも表示されており、分かりやすい結果だと思います。A.地域名;いかがでしょうか?最初は難しく感じるかもしれませんが、初級コースを終わるころには難しくはなくなっているはずです。日本のシステムでは和暦を表示する必要がまだまだあります。Javaの場合、自作しなくともLocaleオブジェクトでvariantを指定することで対応可能です。通常Localeオブジェクトは第2引数までですが、第3引数に「JP」を指定し、書式でyyの前にGGGGと指定すると2016年11月11日時点では「平成」、GGGと指定すると「H」と表示されます。意外と重宝しますので、以下のメソッドをご参考までに。BY句を使用したサブクエリは使用できないSQLの参考書の中には特定のRDBMS製品に特化したものもありますが、私の場合、あえて一般的なSQLの参考書を使用しています。その場合、困るのは参考書通り実行してもエラーになる場合です。私が困るわけではなく、生徒さんが困るわけですが、そういう状況に出くわした場合にどう対応するかを学んでほしいのです。「スッキリわかるSQL入門」p232の2の問題は解答通りには動きません。練習問題の概要をざっくりと説明します。牛の個体識別テーブルと頭数集計テーブルが出てきます。コード(1が雄、2が雌)、母牛番号、品種コード、飼育県の列で構成され、頭数集計テーブルは個体識別テーブルの飼育県と飼育県毎の頭数を集計した列で構成されています。質問は「頭数集計テーブルのうち、飼育頭数の多い方から3県に限っての牛の情報を個体識別テーブルから取得せよ」というものです。本書の解答は以下の通りです。BYを使うとエラーになるのです。みなさんならどうやって解きますか?実はこのあたりの解き方に慣れるとSQLを読み書きする能力が飛躍的に向上します。分からない場合は以下の私の解答例を見てください。K.飼育県);どうでしたか?分かりましたか?分からない場合は、SQLに関してはまだ初級者だと思われます。一緒に勉強してみませんか。【JavaScript】addEventListenerでイベントの伝播方向を指定するイベントハンドラを登録するには下記の3つの方法があります。要素のプロパティに関数を登録する方法。イベントハンドラは下記のように関数リテラルでも、function命令の関数でも構いません。true);});上記(1)や(2)の登録方法ではできない、以下のことが実現可能です。同じ要素の同じイベントに対する複数のイベントハンドラの登録が可能イベントを文字列として指定するため、将来開発される未知のイベントにも対応可能イベントハンドラの登録解除が可能イベントの伝播方向を制御可能イベントの伝播方向はaddEventListenerの第3引数で指定します。Bubblingとなります。【Java】Queue構造としてArrayListが向いていない理由Queue構造を実装するのにLinkedListではなくArrayListでも構わないのかという質問を先週受けました。確かに両者ともListインタフェースを実装していますが、中の作りが全く異なります。ArrayListは名前の通り、内部に配列を保持しています。インデックス操作によりアクセスをしています。LinkedListはフィールドにprivateな内部クラスであるNodeの参照を2つ持っています。一つは先頭のNodeの参照、もう一つは末尾の参照です。Nodeクラスの内部はフィールドとしてNodeの参照を2つ持っています。一つは次のNodeの参照を保持し、もう一つは前のNodeの参照を持っています。LinkedListはインデックス操作ではなく、参照をたどることにより前後に移動します。インデックス操作するArrayListと参照をたどる操作をするLinkedListの決定的な違いはなんでしょうか?ArrayListをQueue構造に使用すると、先頭から要素を削除した場合、インデックスを1つずつずらす操作が必要になります。件数が多いときは明らかに効率が悪いですね。それに対しLinkedListは、Nodeオブジェクトのnextとpreviousをつなぎかえる作業をするだけです。件数とは全く関係ありません。先頭と末尾を管理している、しかも削除しても全体には影響を与えず、2番目の要素と末尾の要素のリンクの貼り直しだけで済みます。LinkedListの方がQueueに向いていることは明らかですね。文章だけで説明したため、すっきりしない場合、LinkedListのソースコードを読むことをおススメします。【JavaScript】既存のclassを消去することなくclassを追加、置換する方法JavaScriptからStyleを操作するにはインラインでstyle属性を直接指定する方法や、class属性を操作することによりCSSを適用する方法があります。class属性を操作する場合、不用意に値を代入することは危険です。既存のclassを消去することになるからです。最近のフレームワークは要素に対し勝手にclassを追加するため、代入で消してしまうとフレームワークが正常に動作しなくなります。これを解決する方法はいろいろあるかと思いますが、配列操作のいい練習になるため、配列を使って解決する方法を紹介します。一例なので状況に応じて変更してください。hilight、normal、abortは同時に適用されることがないと仮定します。red;}JavaScriptでイベントハンドラを定義します。');}HTML、body部の記述。既存のclassを消去しないか確認するため、clazz1とclazz2をclassに指定しておきます。classNameに不用意に代入していないか?</div>Chromeをはじめとしたブラウザで検証してください。clazz1やclazz2はそのままで、hilihgt、normal、abortが入れ替わっている様子が分かるはずです。冗長な書き方ですが、簡単は配列操作でも実現可能です。今日は無料体験授業の日なので実際の授業はやっていません。来年コースにしたいPythonの勉強をしています。Python」で少し応用が利く分野にチャレンジ中です。以下の図はmatplotlibのpyplotでバーチャートを描画した結果です。先週の曜日毎の歩数をバーにしています。何か形として見える学習は楽しいですね。【SQL】運用任せのSQLは避けるべきSQL初級コースは「スッキリわかるSQL入門」を教材として使用しています。市販の教科書は実務では避けたいようなことが書かれています。第3章の問題3-3は非常に不適切な問題です。いう不適切な問題があるからこそ、このように解いてはダメと言えるのです。指導してくれる先生がいるとかえってこのような問題が理解力を深めると考えています。このあたりが独学の限界ですね。問題3-3をざっくり説明します。総合成績は最初nullです。名前以外の科目は点数が格納されています。その点数をもとに以下の条件で総合成績を求めます。全科目が80以上の学生は「A」とする。法学、外国語のどちらかが80以上で、経済学、哲学のどちらかが80以上は「B」とする。全科目が50未満の学生は「D」とする。それ以外の学生を「C」とする。最初この問題を見たときは「おっ、いい問題だ」と思いましたが、解答をみたら愕然としました。このSQLを実務で運用していくのは困難だからです。以下が解答のSQLです。NULL;問題点に気づかれたでしょうか?問題は総合成績を求めるのに4つのUPDATE文が必要で(1)から順に実行しないと正常に働かない。どこか1つでも成績を修正したら、一旦以下の手順でもう一度総合成績を求める必要があるのです。すべてのレコードの総合成績をnullにする(1)のUPDATE文を実行する(2)のUPDATE文を実行する(3)のUPDATE文を実行する(4)のUPDATE文を実行する運用で縛らなければならないSQL文は最悪です。解答を見ただけでこれに気付く生徒さんは一握りです。独学の怖さがここにあります。これをシンプルに解くにはCASE演算子が一番ふさわしいと思います。皆さんも挑戦してください。ServletへのJSONの受け渡しjQueryやAngularなどのライブラリーやフレームワークはほとんどJSONの存在を意識することなくJavaScriptとサーバサイドの言語のやり取りができます。ある生徒さんがそういうフレームワークを使わずシステムを作りたいというので久しぶりに生のJavaScriptと生のServletで挑戦。"application/x-www-form-urlencoded");xhr.send(members);サーバサイドJavaScriptのオブジェクトをJavaBeansへ変換。配列も配列へ変換できます。JSONICは直感的でいいですね。【PHP】感動する力PHPを勉強し始めて間もない生徒さんに、年齢と性別を入力して料金を計算するプログラムを作ってもらいました。A.phpからB.phpにデータを送り、if文の入れ子で料金を求めるというだけの極めてシンプルなものですが、非常に感激してもらい、こちらまで嬉しくなりました。思うのですが、「感動する力」は能力を伸ばすための大きなエネルギーです。この気持ちを忘れないでください。【JavaScript】setIntervalとsetTimeoutを使った移動サイトへのジャンプの仕方サイトのURLを変更したとき「当サイトは下記リンクへ移動しました。下記リンクをクリックするか、10秒後に自動的にジャンプします」のようなメッセージが出てきますが、setIntervalとsetTimeoutメソッドを使うと簡単に実装できます。ジャンプする前にclearIntervalでインターバル処理をストップします。