はじめに こんにちは、ysugiyamaです。今年もそろそろ終わりですね。卒論は...まぁどうにかなるでしょう。 今回は少し前からハマっている競技プログラミングについて少し書いていこうと思います。 対象読者としては、すでにコーディングをしていて競技プログラミングを始めたいけど雰囲気がつかめないという人、他の人がどんな感じの考えをもってるか知りたい競プロ初心者の人を主に考えています。僕自身、今の所競プロ関連でちゃんと参加しているサービスはAtCoderのみで、始めてから半年程度の水色コーダーなのであまり高度なことは喋れないです、ご了承ください。 競技プログラミングってなんだろう こんな問題が出ます この項目は他の記事でもたくさん紹介されている気がするのでそこまで力を入れるつもりはありませんが軽く紹介しておきましょう。 Wikipediaさんはこう言っています。 競技プログラミングでは、参加者
venv について venv を使うと pip によるパッケージの導入状態をプロジェクトごとに独立させることができる. venv は virtualenv が Python 3.3 から標準機能として取り込まれたもの.別途ソフトウェアをインストールすることなく使用できるため,最も手軽に仮想環境を管理する方法の一つと言える. 2 系を偶に使うという程度なら 3 系は venv,2 系は virtualenv で管理すると同じように管理できるので良い. Since Python 3.3, a subset of it has been integrated into the standard library under the venv module. Virtualenv — virtualenv 16.6.1 documentation Python 3.x.x 下に組み込まれた機能なので
営業一課で使っている PHPアプリを保守してくれないかな? ○○さんが1人で作ってメンテしてたやつなんだけど 皆さんは上司からこんな仕事を振られたことはないでしょうか?私は過去に何度か経験した1のですが、こういった仕事はなぜか: 正確な仕様を知っている人はいない(知ってた人は辞めた) テスト計画書・デプロイ手順書・仕様書といったドキュメントは無い ソースコードはもちろんスパゲッティ でも、業務ではガッツリ使われているので廃止できない というレガシープロジェクトばかりでした。この記事では、レガシープロジェクトを引き継いでしまった時に、最初に何をするべきか書いていきたいと思います。 なお、ここで最悪なのは「とりあえず、緊急の不具合から直してしまおう」と、いきなりコードの修正にかかることです。 ※おことわり: この記事では「遵法的な職場の」「PHPやRailsで書かれた」「社員25人が使う」「業
あのWebサービスもJVMを利用している 「Javaは大規模なエンタープライズシステムにしか使われない」 それが常識だと思っていませんか? たしかに、これまでJava Virtual Machine(JVM)は、他の言語を実行すると遅く、Javaのプログラムを実行する環境にすぎないものでした。ところが、Java 7から実装されたInvokeDynamicにより、JVM上で、RubyやPHPなどさまざまなコンピュータ言語で記述されたプログラムをより高速に実行できるようになりました。 これにより、今までエンタープライズでJava言語で記述されたプログラムを実行するだけの環境であったJVMが、汎用的な実行環境になったと言えます。また、これまでJavaの実行環境として使用されていたノウハウが、他の言語で記述されたプログラムを実行する際にも利用できます。 最近では、TwitterがJVMをアプリケー
システムが大規模になるとファイルを分割し、各機能が分割して管理されるようになります。一つのファイルで長大なコードが書かれているよりも分かりやすいですが、定義元がどこで、何の変数を見ているのか分からなくなることもしばしばです。 そこで使ってみたいのがCodecrumbsです。コードに印をつけることで、コード同士の関連性が可視化されます。 Codecrumbsの使い方 デザイン例です。 折りたたむこともできます。 フローチャートで確認することもできます。 コードには以下のような独自のコメントを定義する必要があります。 function authenticate(provider) { return dispatch => { //cc:signin#1;firebase sign in;+2;call to firebase with auth provider, proceed if suc
フローチャート ※依存関係・フローチャートはJavaScriptのみです。 対応言語は、下記の通り。 JavaScript TypeScript Python PHP Java C++ 望む言語が他にあればIssueにどうぞ、とのことです。 Code Crumbsのデモ デモでは、JavaScriptのコードでその動作を確認できます。 デモページ 依存関係はDependenciesをオンに、フローチャートはFlowChartタブをクリックします。 Code Crumbsの使い方 セットアップ codecrumbをインストールします(yarn global add codecrumbs)。 codecrumbs -d project-src-dir -e project-src-dir/index.jsを実行し、プロジェクトに合わせてパラメータを変更します。-dはソースコードを含むディレクト
はじめに この記事は、僕が配属当初に先輩からよく言われた「ソースコードはしゃべるように書け」について、それが具体的に何を意味するのかを、配属から6年経った今改めて考えてみる記事です。 その先輩はすでに辞め新しいステップへ進まれてしまったためにその真意を直接聞き直して確認することはできないのですが、今の僕なりの解釈、ということで書いてみます。 とは言え、「ソースコードはしゃべるように書け」は「ソースコードの読みやすさ」という意味では役に立つ考え方ですが、それがどんな場面でも正しいかというとそうではないと思っています。おそらく、自然言語に近づけた書き方よりも、より機械の仕組みに近づけた書き方をした方がはるかに効率がよかったり、安全な言語や場面もあると思います。 また、仕様自体が複雑だったり、既存のソースがすでに汚いなどの理由で、この記事に書いたようなことがすんなり実行できる環境というもの自体が
Java5以降では総称型(generics)がJava言語に導入されています。総称型自体は、最近の静的な型付けのプログラミング言語で珍しいことではなく、現在の最新版では.NETのC#やVisual Basicにも導入されています。一般的には総称型をサポートするクラスライブラリを自分で正しく定義することは非常にスキルがいるが、事前に定義されたクラスを使うだけであれば、それほど難しくないとされています。しかし、Java言語の総称型は本エントリで説明するように特殊なところがあり、単に利用するだけでも他の言語に比べて遥かに難しいところがあるというのも事実です。特に総称型をパラメータ化する際に指定するワイルドカード型(List<? extends Serializable>など)の意味を正しく理解して使いこなすことは簡単なことではありません。その結果、昔のJDK1.4までのように型パラメーターのない
総称型(ジェネリクス)とは 総称型の書き方 クラス メソッド コンストラクタ 総称型のネーミング ワイルドカード(非境界ワイルドカード) extends と super(境界ワイルドカード) <? extends T>(上限付き境界ワイルドカード) <? super T>(下限付き境界ワイルドカード) まとめ 総称型(ジェネリクス)とは それまでは、Object 型で書かれていた型指定に対して、利用する型を限定できるように Java1.5 より、総称型が導入された。 主に Collection に対して導入されているので、実際に API を見てみる方が理解が早いと思う。 Java1.4 ArrayList.html#get(int)) では、次のように API が定義されている。 注目して欲しいのは、List に対する get の戻り値で Object 型で定義されている。つまり、Java
プログラミングでよく使う英単語のまとめ【随時更新】 随時追加、整理していきます。 名前をつけるときには、名詞、動詞の違い、複数形、過去形などに注意しましょう。 オブジェクト指向では、クラス名は名詞、メソッドは動詞とします。 使ってはいけない言葉 get / set アクセサ (getter / setter) やプロパティによく使われている。 それ以外に使うと混乱を招くのでよくない。 get は軽量な処理と考えるので、中に重い処理は書いてはいけない。 単純な取得/設定以外で使いたくなったら他の言葉を考える。 load, save, commit, store, enable, disable, fetch, register, configure, add, etc... check 意味が広すぎて何をしているかわからない。 できるだけ別の言葉を使う。 具体的に何をしているかに分解して考え
プログラムのソースを眺めているとときどき目にする TODO などのコメントを、もっと活用しよう、というお話です。 アノテーションコメントとは アノテーション (annotation) とは注釈という意味です。 アノテーションコメントとは「コメントにメタデータを付加するもの」で、次のような記号が打たれたコメントを指します。 アノテーションコメントを適切に利用することにより、コメントのみの場合よりもソースの把握や修正すべき点の把握が容易になります。 よくある問題 だからといって「とりあえず TODO つけておこう」という感覚で運用していくと、簡単に破綻します。 とくにプロジェクトの初期では大量に TODO がつくこともあますね。 こうなると TODO の数が多すぎて何から手を付けてよいかわからなくなったり、対応しきれなくて炎上してしまうことになりかねません。 まとめると、次のようなケースがよく
さて、Java8で関数型っぽいことをやって遊んでみたわけですが、実際はそんな書き方しませんよね。 Java8で実際に使うのは、Streamです。 ということで、Streamの使い方をひととおり見てみます。 ※5/17 仕様変更があったので、修正しました 基本 まずは、Iterableインタフェースに用意されたforEachメソッドを見てみましょう。 List<String> names = Arrays.asList("hoge hoge", "foo bar", "naoki", "kishida"); names.forEach(s -> System.out.println(s)); これで次のように表示されます。 hoge hoge foo bar naoki kishida いままでの拡張forだと次のように書いてました List<String> names = Arrays.a
Java8でのラムダの使い方などを説明してきたのですが、構文拡張自体には触れていなかったので、改めてここで簡単に説明しておこうと思います。 まずは、Java8で実際に最もインパクトがある言語拡張、インタフェースのデフォルトメソッドです。 デフォルトメソッドとデフォルト実装 いままでインタフェースには実装をもつことができませんでしたが、Java 8からはインタフェースが実装をもてるようになります。 実装をもつメソッドを定義するときには、キーワードdefaultをメソッドの前につけます。 interface Foo{ void print(String s); default void twice(String s){ print(s); print(s); } } twiceメソッドが実装をもっています。この実装をデフォルト実装といいます。 デフォルトメソッドを実装するクラスで、デフォルトメ
デフォルトメソッドは前に解説しました。 Java8で最もインパクトのある構文拡張、デフォルトメソッド ここでは、それ以外の構文拡張についてまとめておきます。 ラムダ式 実装すべきメソッドがひとつだけのインタフェースを関数型インタフェースといいます。 UnaryOperatorインタフェースは実装すべきメソッドがapplyメソッドひとつだけなので、関数型インタフェースになります。 たとえば、UnaryOperatorインタフェースを実装したクラスを定義すると次のようになります。 class MyOp implements UnaryOperator<String>{ @Override public String apply(String t) { return "** " + t + " **"; } } このUnaryOperatorインタフェースを使う、List#replaceAllを
LINEヤフーから日本語CLIPが出ていたので、どうやって使うんだろうと試してたら、なんかめちゃくちゃ便利な画像検索ができてしまいました。 clip-japanese-basic LINEヤフーの日本語CLIP、clip-japanese-baseはこちらで紹介されています。 高性能な日本語マルチモーダル基盤モデル「clip-japanese-base」を公開しました HuggingFaceのモデルはこちら。 https://huggingface.co/line-corporation/clip-japanese-base CLIPとは? ところでCLIPとは、となりますけど、OpenAIが公開してる、言語と画像を扱える機械学習モデルです。Contrastive Language-Image Pre-Trainingの略らしい。 https://openai.com/index/clip
砲撃する自走砲(PzH2000自走榴弾砲)。自走砲は戦車によく似ていますが、戦車ではありません。*本編とは関係ありません。 こんにちは、エムスリー基盤開発チーム小本です。 Pythonのパッケージ管理周りでは、 「setup.pyでrequirements.txtを読み込むのが普通なんですよね?」 「pipenv があれば venv はオワコンなんですね?」 「pyenvは要らないんですよね!?」 「Pythonは歴史が古い分、Rubyなどに比べてカオス」 みたいな混乱をよく目にします。 実際、複数のツールがあって(一見)複雑です。また「なぜこうした状況にあるのか」がドキュメント化されているわけでもありません。 なので、私なりに整理してみることにしました。 ※「追伸」を追加しました。この記事では汎用プログラミング言語としてPythonを使うケース(Webアプリとか、CLIツールとか、ライブ
「専門学校では、全くの素人に、体系的にプログラミングを教えることで、それなりにプログラムが書けるようにしている」という記事が賛同を多く集めていた。 しかし、私の場合、まったく逆だった。体系的にプログラミングを教えられたらすぐに挫折したけど、体系もカリキュラムも全部無視して、自分の興味の赴くままにプログラミングを学んだら、ごく短期間に、劇的にプログラミング能力が高まった。 元記事によると、専門学校では、素人は、まず、簡単なアルゴリズムの問題集をやらされるとのことだが、こんなことをやらされたら、僕のようなタイプの人間は、まず挫折する。 実際、大学でプログラミングの授業を履修したときは、すぐに挫折した。 なぜなら、退屈だからだ。 僕は、子供の頃からそうなのだが、退屈なことを続けることができない。だから、小学生の時に公文式をやったときも、すぐに挫折した。しかし、学校の算数のテストでは、満点以外の点
自分の中でひっかがりを感じることを整理するため、なんとなく、こんな図を書いてみて、それからそれに文章を付けてみます。 マルが OOPやOOの名前、四角がそれを構成する要素・・・みたいな感じの適当な図です。また、赤の四角がプログラムの構造についての考え方、青の四角が型チェックについての考え方。用語や関係は適当です。(ご容赦) クラスには「型」と「モジュール」の、二つのとらえ方があります。メイヤー先生の「オブジェクト指向入門」から(artonさんをパクって)引用すると、 繰り返しになるが、クラスを型と見るか、またはモジュールと見るかによってすべては決まる。型として見る場合、継承はis-a(……は……の一種である)という関係であり、明らかに特殊化である。"犬"は"動物"よりも特殊な概念であり、"長方形"は"多角形"よりも特殊化されている。この関係はすでに述べた部分集合の関係に対応する。(中略)
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く