「string」を含む日記 RSS

はてなキーワード: stringとは

2018-05-11

Python, unpacking dict in oneliner.

import string
locals().update({var: obj for obj, var in enumerate(string.ascii_letters)})
assert a == 0
assert b == 1
assert c == 2

2018-04-27

ふと思い出したクソコード

/*
    このメソッドを使うにあたり〜〜〜に注意してください。
    実行前に〜〜〜を〜〜〜しておく必要があります。
    使い方を理解したらagreementtrueをセットしてコールしてください。
**/
func hoge(fuga: String, agreement: Bool = false) {
    if !agreement {
        fatalError()
    }

    // ここから実際の処理
}

実際は別の言語だったけど、概ねこんな感じ。

何年も前から存在してるレガシーコードだった。

2018-04-17

Quick Tutorial for Pyramidをやってみる

PyramidPython向けWebフレームワーク

Quick Tutorial for Pyramid公式チュートリアル

https://docs.pylonsproject.org/projects/pyramid/en/latest/quick_tutorial/index.html

Prelude: Quick Project Startup with Cookiecutters

$ $VENV/bin/cookiecutter gh:Pylons/pyramid-cookiecutter-starter --checkout 1.9-branch

として、プロンプトの問いに答えるとサンプル的なアプリができる。

ghはgithubか。

引数指定できるテンプレートhttps://github.com/Pylons?q=pyramid-cookiecutter

sqlalchemyを使うものは分かるけど、zodbって何?

アプリは以下のようにして起動する。

$ env/bin/pserve development.ini --reload

このpserveというPythonモジュールアプリ動かしたりする。

01: Single-File Web Applications

超単純なPyramidアプリを作って、WSGIイメージをつかむ。

app.py を書き写して動かしたらHello Worldが動いた。

Analysisの項:
2. Lines 12-14. Use Pyramid's configurator in a context manager to connect view code to a particular URL route.

viewURLの紐付けはconfig.add_routeしてconfig.add_viewする。add_viewしてからadd_routeしても大丈夫だった。

3. Lines 6-8. Implement the view code that generates the response.

viewにはrequestが渡される。requestに色々入ってそう。

4. Lines 15-17. Publish a WSGI app using an HTTP server.

waitressは知らないけど、serveでHTTPサーバ作ってWSGIアプリを公開できるのかな?

Extra creditの項:
1. Why do we do this:
print('Incoming request')

...instead of:

print 'Incoming request'

Python3だから

2. What happens if you return a string of HTML? A sequence of integers?

Inernal Server Errorになった。アプリのほうではValueErrorresponseを返すようにと怒られていた。text/plainとか返すには何かしないとダメっぽい。

3. Put something invalid, such as print xyz, in the view function. Kill your python app.py with ctrl-C and restart, then reload your browser. See the exception in the console?

print(xyz)してみろ、ということかな。1と同じくInernal Server Errorになって、コンソールにはNameErrorが出た。

4. The GI in WSGI stands for "Gateway Interface". What web standard is this modelled after?

CGIかな?

2018-04-08

読んだページを全部自動ブクマする

数日前に puppeteer で自動PDF にする試みを書いたブログホッテントリに入ってるのを見た

それに影響されて自動ブクマするもの作ってみた

bg.js

const username = ""
const api_key = ""

chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
	if(message.bookmark){
		bookmark(message.bookmark)
	}
})

async function bookmark(url){
	fetch("http://b.hatena.ne.jp/atom/post", {
		method: "POST",
		referrer: "no-referrer",
		headers: {
			Accept: "application/x.atom+xml, application/xml, text/xml, */*",
			"X-WSSE": await createCredential(),
		},
		body: `
			<entry xmlns="http://purl.org/atom/ns#">
				<link rel="related" type="text/html" href="${url}" />
			</entry>
		`.replace(/\t/g, ""),
	}).then(e => {console.log(e)})
}

async function createCredential(){
	const non = Math.random().toString(36).substr(2)
	const now = new Date().toISOString()
	const buf = new TextEncoder().encode(non + now + api_key)
	const u8a = new Uint8Array(await crypto.subtle.digest("SHA-1", buf))
	const str = Array.from(u8a, e => String.fromCharCode(e)).join("")
	const b64 = btoa(str)
	return `UsernameToken Username="${username}", PasswordDigest="${b64}", Nonce="${btoa(non)}", Created="${now}"`
}

username と api_key を埋めてバックグラウンドで動かす

page.js

chrome.runtime.sendMessage({
	bookmark: location.href
})

ページ内で動かすコード

URLバックグラウンドに投げる

今は全部投げるコードになってるが、必要に応じていらないドメインを弾いたりする

2018-03-28

やったー Javahello world かけたよ!

    public static void main(String[] args) {
        System.out.println(helloWorld());
    }

    // https://stackoverflow.com/questions/15182496/why-does-this-code-using-random-strings-print-hello-world
    private static String helloWorld() {
        return IntStream.of(-229985452, -147909649)
                        .mapToObj(Random::new)
                        .map(ran -> IntStream.generate(() -> ran.nextInt(27))
                                             .takeWhile(k -> k != 0)
                                             .map(k -> k + '`')
                                             .collect(StringBuilder::new,
                                                      StringBuilder::appendCodePoint,
                                                      StringBuilder::append))                 
                        .collect(Collectors.joining(" "));
    }

StringBuilder で文字列化してるところがなんとも野暮ったい感じなんだけどどうにかならないかな?

# スーパー pre だと > が &gt; に変換されて見にくいので修正しました (面倒くさいなあ、もう)

2018-03-23

anond:20180322185249

横田だが失礼

ゲームを作っているとき勇者名前便宜上「yuusha」で、

シナリオ中のセリフも「おお愛しのyuusha様!」とか「yuushaは死んでしまった」なんだけど、 この「yuusha」を変数にしておくと

実際のプレイ名前入力画面で「ああああ」といれると全てのyuushaという文字列が「ああああ」に置き換わり「おお愛しのああああ様!」「ああああは死んでしまった」といった表示になる

これはシナリオを書く前に String yuushaと変数宣言

完成後、プレイ中の名前入力画面で

yuusha="ああああ"という処理をしているということ

2018-02-13

anond:20180213003927

public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Button btClick = findViewById(R.id.btCalc);

CalcListener listener = new CalcListener();

btClick.setOnClickListener(listener);

}

private class CalcListener implements View.OnClickListener {

@Override

public void onClick (View view) {

EditText input1 = findViewById(R.id.etInput1);

EditText input2 = findViewById(R.id.etInput2);

TextView output = findViewById(R.id.tvOutput);

String input1str = input1.getText().toString();

Integer input1int = Integer.parseInt(input1str);

String input2str = input2.getText().toString();

Integer input2int = Integer.parseInt(input2str);

output.setText(input1int + input2int + "です" );

}

}

}

Integer.parseInt()を見つけるのが最大の難所であった

2017-09-18

あのさあ・・

追記。自己解決しました。解決編は後編で。前編は、あたふたしたこと履歴になっております

1

$ rake setup
rake aborted!
No Rakefile found (looking for: rakefile, Rakefile, rakefile.rb, Rakefile.rb)

(See full trace by running task with --trace)

は?

 

$ git clone https://github.com/hanachin/rurema-kaku
Cloning into 'rurema-kaku'...
remote: Counting objects: 47, done.
remote: Compressing objects: 100% (26/26), done.
remote: Total 47 (delta 20), reused 44 (delta 17), pack-reused 0
Unpacking objects: 100% (47/47), done.
Checking connectivity... done.

$ cd rurema-kaku/

$ ls
Gemfile  Gemfile.lock  Guardfile  README.md  Rakefile  config.ru

$ rake setup
rake aborted!
/rurema-kaku/Rakefile:24: unknown type of %string
directory "public/theme" =&gt; %i(bundle_install public) do
                               ^
/rurema-kaku/Rakefile:24: syntax error, unexpected $end
directory "public/theme" =&gt; %i(bundle_install public) do
                               ^

(See full trace by running task with --trace)

あれかな。

 

$ ruby -v
ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-linux]

たぶん、これ。

 

2

$ rbenv commands
--version
commands
completions
exec
global
help
hooks
init
local
prefix
rehash
root
shell
shims
version
version-file
version-file-read
version-file-write
version-name
version-origin
versions
whence
which

installがない?

 

$ rbenv --version
/usr/lib/rbenv/libexec/rbenv---version: 17 行: cd: /home/unko/.rbenv: そのようなファイルディレクトリはありません

詰み。

 

rubyやーめた

 

3 - bash on Windows

$ rake setup
-bash: /mnt/c/Ruby23-x64/bin/rake: C:/Users/Justin/Projects/rubyinstaller/sandbox/ruby23_mingw/bin/ruby.exe: bad interpreter: No such file or directory

Justinって誰だよww

 

$ ruby -v
ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-linux]

こっちの環境でも古かったか・・

 

 

rubyやめるしかないな

 

 

4

# apt-get install ruby-build
# rbenv install -l
usage: rbenv install VERSION
       rbenv install /path/to/definition

Available versions:
  1.8.6-p383
  1.8.6-p420
  1.8.7-p249
  1.8.7-p302
  1.8.7-p334
  1.8.7-p352
  1.8.7-p357
  1.8.7-p358
  1.9.1-p378
  1.9.2-p180
  1.9.2-p290
  1.9.2-p318
  1.9.2-p320
  1.9.3-dev
  1.9.3-p0
  1.9.3-p125
  1.9.3-p194
  1.9.3-preview1
  1.9.3-rc1
  2.0.0-dev
  jruby-1.6.3
  jruby-1.6.4
  jruby-1.6.5
  jruby-1.6.5.1
  jruby-1.6.6
  jruby-1.6.7
  jruby-1.6.7.2
  jruby-1.7.0-preview1
  maglev-1.0.0
  rbx-1.2.4
  rbx-2.0.0-dev
  ree-1.8.6-2009.06
  ree-1.8.7-2009.09
  ree-1.8.7-2009.10
  ree-1.8.7-2010.01
  ree-1.8.7-2010.02
  ree-1.8.7-2011.03
  ree-1.8.7-2011.12
  ree-1.8.7-2012.01
  ree-1.8.7-2012.02

古いような気がする。

 

 

# apt-get upgrade rbenv
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
rbenv is already the newest version.
The following package was automatically installed and is no longer required:
  os-prober
Use 'apt-get autoremove' to remove it.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

# apt-get upgrade ruby-build
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
ruby-build is already the newest version.
The following package was automatically installed and is no longer required:
  os-prober
Use 'apt-get autoremove' to remove it.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

ruby界隈もうダメだな

python流れるのがうなずけるわ

 

 

5

なんとかしてruby 2.4をパッケージマネージャからインストールソースからビルドじゃないよ。やり方は教えません。

# rake setup
bundle check || bundle install
The following gems are missing
 * progressbar (0.21.0)
 * rack (2.0.3)
 * bitclust-core (0.9.5)
 * coderay (1.1.2)
 * eventmachine (1.2.5)
 * http_parser.rb (0.6.0)
 * em-websocket (0.5.1)
 * ffi (1.9.18)
 * formatador (0.2.5)
 * rb-fsevent (0.10.2)
 * rb-inotify (0.9.10)
 * ruby_dep (1.5.0)
 * listen (3.1.5)
 * lumberjack (1.0.12)
 * nenv (0.3.0)
 * shellany (0.0.1)
 * notiffany (0.1.1)
 * method_source (0.8.2)
 * slop (3.6.0)
 * pry (0.10.4)
 * thor (0.20.0)
 * guard (2.14.1)
 * guard-compat (1.2.1)
 * multi_json (1.12.2)
 * guard-livereload (2.5.2)
 * spoon (0.0.6)
 * guard-rack (2.2.0)
 * rack-livereload (0.3.16)
Install missing gems with `bundle install`
Fetching gem metadata from https://rubygems.org/...........
Fetching gem metadata from https://rubygems.org/..
Installing progressbar (0.21.0)
bInstalling rack (2.0.3) und                                                                                           
Installing bitclust-core (0.9.5)
Installing coderay (1.1.2)
Installing eventmachine (1.2.5)
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /var/lib/gems/2.4.0/gems/eventmachine-1.2.5/ext
/usr/bin/ruby2.4 -r ./siteconf20170918-66-19devli.rb extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h

extconf failed, exit code 1

Gem files will remain installed in /var/lib/gems/2.4.0/gems/eventmachine-1.2.5 for inspection.
Results logged to /var/lib/gems/2.4.0/extensions/x86_64-linux/2.4.0/eventmachine-1.2.5/gem_make.out
An error occurred while installing eventmachine (1.2.5), and Bundler cannot continue.
Make sure that `gem install eventmachine -v '1.2.5'` succeeds before bundling.
rake aborted!
Command failed with status (5): [bundle check || bundle install...]
Rakefile:13:in `block in &lt;top (required)&gt;'
Tasks: TOP =&gt; setup =&gt; template =&gt; bundle_install
(See full trace by running task with --trace)

まらんなあ・・。

 

 

6

5はbash on Windows特殊環境下ってのは否めなかったので、やむを得ずネイティブLinuxで。

 

同じエラー発生。

# gem install eventmachine -v '1.2.5'
Building native extensions.  This could take a while...
ERROR:  Error installing eventmachine:
	ERROR: Failed to build gem native extension.

    current directory: /var/lib/gems/2.4.0/gems/eventmachine-1.2.5/ext
/usr/bin/ruby2.4 -r ./siteconf20170918-3352-1g6kzdu.rb extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h

extconf failed, exit code 1

Gem files will remain installed in /var/lib/gems/2.4.0/gems/eventmachine-1.2.5 for inspection.
Results logged to /var/lib/gems/2.4.0/extensions/x86_64-linux/2.4.0/eventmachine-1.2.5/gem_make.out

# apt-get install ruby-dev
パッケージリストを読み込んでいます... 完了
依存関係リー作成しています                
状態情報を読み取っています... 完了
ruby-dev はすでに最新版です。
以下のパッケージ自動インストールされましたが、もう必要とされていません:
  libntdb1 linux-headers-4.2.0-27 linux-headers-4.2.0-27-generic
  linux-image-4.2.0-27-generic linux-image-extra-4.2.0-27-generic python-ntdb
これを削除するには 'apt-get autoremove' を利用してください。
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 414 個。

# apt-get upgrade ruby-dev
パッケージリストを読み込んでいます... 完了
依存関係リー作成しています                
状態情報を読み取っています... 完了
アップグレードパッケージを検出しています ... 完了
ruby-dev はすでに最新版です。

rubyで消耗するのやーめた

 

 


 

rubyLinux界隈が*年経っても使えないので、work aroundで自己解決しました。

 

まずは、rurema-kaku

https://github.com/hanachin/rurema-kaku

$ git clone https://github.com/hanachin/rurema-kaku
$ cd rurema-kaku/
$ rake setup

以降、うまくいく場合は、そのままで。なんかしらエラーなっちまった場合は、↓が参考になるかもよ?なお、bash on Windowsでやってる。

 

ruby、他をインストール

ruby 2.4

https://stackoverflow.com/questions/26595620/how-to-install-ruby-2-1-4-on-ubuntu-14-04&gt;|

$ sudo apt-add-repository ppa:brightbox/ruby-ng
$ sudo apt-get update
$ sudo apt-get install ruby2.4

複数バージョンを混在させて・・みたいなのもできるみたいだけど、クソなのでキーワードだけ:rbenv

 

rake
$ sudo apt-get install rake

コマンド履歴にあったので、一応。)

 

ruby-dev(知らん)

http://qiita.com/mrmr/items/24302bc9812c820bda91

$ sudo apt-get install ruby2.4-dev

 

↑だけでダメだったら、↓を手当たり次第試す

$ sudo apt-get install ruby2.3-dev
$ sudo apt-get install ruby2.2-dev
$ sudo apt-get install ruby2.1-dev
$ sudo apt-get install ruby-dev

 

bundler(まったく不明
$ sudo apt-get install bundler

(ほんとは、gemからインストールする??てか、aptgemで違うもん?だよなw これもコマンド履歴にあって、なんかしら効果があったような気がしたので・・。)

apt installしなくても、rake setup 時に必要なのがインストールされるかも)

 

愚痴

こんなの2017年にやることじゃないだろ・・。Linux終わったな。

 

ruremaに戻る

$ rake setup
$ bundle exec guard

ブラウザで、http://localhost:9292/ 開いて、「るりま書く」ってでてきた。たぶんOK・・だと・・と思う・・。

doctree/refm/api/src 配下の*.rd? あたりかなと思うけど、なんかなにやればいいかわからん感じ。

2017-06-29

「夢中」で書かれたVBA

退職者が「会社で何らかの『システム』を入れないから、これで作るしかない」といってVBAで作っていた。

一時は社内規定残業上限に達するほどに、「夢中」で作っていた。

が、退職後3ヶ月、あるマクロの書き出すデータに致命的な問題が判明し、私が一部、使用停止を宣言した。

基幹系へ投入するデータ特定条件で確実に狂うのである、それも何ヶ月にも渡って誰も気づかなかった。

当該マクロでのデータ処理を禁止し、1年と少しぐらい、現業部が手作業エクセルデータ作成していたと思う。

ろくに解説サイトも見ないでVBEコードをこねくり回して作っていたのだと思う。

しかすると、解説サイト書籍の内容が理解できなかったのではないか、とすら思う。

Dim da as String
da = "データ"
Dim after as String
after = "修正済"

'----------------------------------------------
With ThisWorkbook.Worksheets(after)
  .Cells(i, 1).Value = ThisWorkbook.Worksheets(da).Cells(i, 1).Value
  .Cells(i, 2).Value = ThisWorkbook.Worksheets(da).Cells(i, 2).Value
  .Cells(i, 3).Value = ThisWorkbook.Worksheets(da).Cells(i, 3).Value
  .Cells(i, 4).Value = ThisWorkbook.Worksheets(da).Cells(i, 4).Value
End with

シートをまたいで、ただ値をコピーして集計していく程度の内容であるが、Workbook/Worksheetの呼出理解できていないのだと思う。

また、変数はワークシート名を格納する程度にしか使っていない。

シートの見出しも「修正決定○○数」という、一体、何の数量なのか理解に苦しむ見出しである

使える制御構文はFor Nextだけらしく、Do WhileやFor Eachもなく、果てはLike構文すら見たことがない。

文字列の判定は全てInstr関数でやっている。

行番号をString型に格納している etc...

その人が退職して直ぐ後のミーティングで、自部署担当役員レジュメにこう書いていた

努力は夢中に勝てない」

退職者も「夢中」で書いていたのだろうか。

最終的には主に上長担当役員に嫌気して辞めていったのだが。

2017-06-06

ジェネリック医薬品.java

interface 頭痛薬 {}

class バファリン implements 頭痛薬 {}

class バッサニン implements 頭痛薬 {}

class 薬瓶<T> { /* 中略 */ }

public class Test {

  public static void main(String[] args) {

    薬瓶 頭痛薬入れ = new 薬瓶<頭痛薬>();

    頭痛薬入れ.add(new バファリン());

    頭痛薬入れ.add(new バッサニン()); // バファリンとバッサニンは成分が同じなので、同じ薬瓶に入れて混ぜて服用しても問題ない

    System.out.println(頭痛薬入れ.size()); // 2

  }

}

2017-06-02

http://anond.hatelabo.jp/20170602170355

Javaは、オブジェクト指向を盲信し、すべてにおいてオブジェクト指向強制したのが間違いだった。

Java で、hello worldプログラムすると

public class Hajimete {

public static void main(String[] args){

System.out.println("Hello, world.");

}

}

こんなに長く書く必要があるのが一番嫌われた理由

他の言語なら

print("Hello, world.");

ぐらいの1行で済むんだ。

2017-05-24

http://anond.hatelabo.jp/20170524200524

C#書いてて多次元連想配列必要になるケースが少ない。

Dictionary<string, Dictionary<string, Dictionary<string, string>>>

とか絶対ない

2017-04-26

メタ構文変数

hoge,piyoの続きだけど、piko,taroを推したい。もう遅いかな?

Javaだとあれだけど、たとえばVBとかだと、面がそろって気持ちいいんだ。

Dim hoge As Integer

Dim piyo As Long

Dim piko As Double

Dim taro As String

$hoge;

$piyo;

$piko;

$taro;

2017-03-03

http://anond.hatelabo.jp/20170303122424

str → ストア

それだと string を指すときにも store を連想しちゃわない?

2016-12-30

規則動詞の分類別一覧

英語の不規則動詞はおおまかに,過去分詞がtかdで終わるもの(以下dtタイプ)とnで終わるもの(以下nタイプ)に分けられる。ほとんどのdtタイプ動詞過去形過去分詞形が同じ形で,A-B-B(一部はA-A-A)のように変化する。また,原形の末尾がdかtの不規則動詞ほとんどがdtタイプに属する。(例外eat,get,bid等)一方,ほとんどのnタイプの不規則動詞は原形,過去形過去分詞形がすべて異なり,A-B-Cのように変化する。

原形から過去過去分詞形になるときに起こる変化は基本的母音が変化するか末尾にdtnが加わるかの2種類,あるいはその両方で,原形にあった子音がなくなることは原則としてない。(例外:-ught型,went,had,made

表の説明

分類は以下の通り

  • dtタイプ
  • nタイプ
    • 【A-B-An】型
    • 【A-Aed-An】型
    • 【A-B-Bn】型
    • 【-dden,-tten】型
    • 【A-B-Cn】型
  • その他
    • 【i-a-u】型
    • 【A-B-B(その他)】型
    • 【その他】

become,forgetなど末尾にほかの不規則動詞を含むものは省いた。

表中の*は規則変化もし得ることを,#は他の不規則変化もし得ることを,!は意味によって変化が異なる単語であることを示す。

【A-A-A】型

すべてdかtで終わる。特に末尾tで短母音のものが多い。get,sitが含まれないことに注意。形が1種類で覚えやすいが,英文中の「have put」「is put」等を見てもビビらない心構えが必要

bet * bust * cast cost cut
hit knit! let put quit *
set shit *# shut sweat * thrust
wet* burst * hurt beat # bid #
clad glid * rid* shed spread
wed*
Ad-Bd-Bd】型

原形がdで終わる動詞母音を変化させて過去形過去分詞形になる型。最後のplead,read発音のみ変化する。

breedbred
feedfed
leadled
plead *#pled
speed !sped
tread #trod
bindbound
find found
grind ground
wind wound
chide *#chid
slide #slid
hold held
stand stood
abide *abode
plead *#plead
readread
Ad-At-At】型

原形の末尾のdがtに置き換わり,それ以外は綴り発音も変わらない。endで終わる動詞が多いが,end自体規則動詞。原形のほうが過去形っぽく見えたりするので注意が必要。逆パターン(At-Ad-Ad)は存在しない。

bend bent
lend lent
rend rent
send sent
spend spent
build built
geld *gelt
gird *girt
At-Bt-Bt】型

Ad-Bd-Bd】の末尾tバージョンget,sitはこちらに含まれる。

fightfought
light *lit
meet met
shoot shot
get #got
shit *#shat
sitsat
【A-Bd-Bd】型

末尾にdが加わるという点で規則動詞に近いが,付き方が特殊母音も変化する。

lay laid
pay paid
say said
sell sold
tell told
hear heard
flee fled
shoe *shod
baa *baa'd
makemade
have had
【A-Bt-Bt】型

末尾にtが加わる。原形の/iː/が/e/に変化するものが多い。

feelfelt
keep kept
sleep slept
weep wept
creep crept
kneel *knelt
sweep swept
leave left
bereave !bereft
cleave *#cleft
deal dealt
mean meant
dream *dreamt
lean *leant
leap *leapt
lose lost
spoil *spoilt
burn *burnt
learn *learnt
dwell dwelt
smell *smelt
spell *spelt
spill *spilt
drip *dript
grip *gript
wrap *wrapt
pen *pent
【-(o/a)ught】型

末尾が-oughtか-aughtに変化する。どちらも発音は/ɔːt/。wentを除けばもっとも原型をとどめない変化が起こるので過去形から原形を思い出せるようにしておく必要がある。

beseech *besought
bringbrought
buy bought
overwork *overwrought
seek sought
think thought
catchcaught
teach taught
【A-B-An】型

過去分詞形が原形+nとなるもの過去形では母音が変化している。fall,eatにはenが,do,goにはneが付くことに注意。

blowblewblown
grow grewgrown
know knewknown
throw threwthrown
drawdrewdrawn
shakeshookshaken
taketooktaken
drivedrovedriven
riseroserisen
strive strovestriven
thrive *throvethriven
see sawseen
give gavegiven
eatateeaten
fall fellfallen
do diddone
gowentgone
【A-Aed-An】型

【A-B-An】の亜種で,showに代表される過去形規則変化(-ed)になっているもの

grave *gravedgraven
hew *hewedhewn
mow *mowedmown
prove *provedproven
saw *sawedsawn
sew *sewedsewn
shave *shavedshaven
show *showedshown
sow *sowedsown
strew *strewedstrewn
【A-B-Bn】型

過去分詞形が過去形+nとなるもの。eが脱落するtear-tore-tornのパターンに注意。wakeはtake,makeと異なり,この型に属する。

break brokebroken
cleave *#clovecloven
freeze frozefrozen
speak spokespoken
steal stolestolen
weave !wovewoven
shrink #shrunkshrunken
wake wokewoken
bear !boreborn
swearsworesworn
tear toretorn
wearworeworn
bear !boreborne
【-dden,-tten】型

原型にd,tを含み,過去分詞形でそれが重なるものget以外は【A-B-An】に近いがgetは【A-B-Bn】に近い。

smite #smotesmitten
ride roderidden
writewrotewritten
bite bitbitten
chide *#chidchidden
hidehidhidden
slideslidslidden
bid #badebidden
forbid #forbadeforbidden
forbid #forbadforbidden
get #gotgotten
【A-B-Cn】型

過去分詞形にnが付くが,【A-B-An】でも【A-B-Bn】でもないもの

flyflewflown
lielaylain
slay slewslain
shear *shearedshorn
swell *swelledswollen
tread #treadedtrodden
【i-a-u】型

原型にiを含み,それがi-a-uと変化していくもの。わかりやすい変化だが数は少ない。

beginbeganbegun
drink drankdrunk
ringrangrung
shrink #shrankshrunk
singsangsung
sinksanksunk
spring #sprangsprung
stink #stankstunk
swim swamswum
【A-B-B(その他)】

dt型でないが,A-B-CではなくA-B-Bと変化するもの。末尾が-ingのものが多いが,bringring,singが含まれないことに注意。

clingclung
flingflung
slingslung
slink slunk
spling #splung
stingstung
stink stunk
stringstrung
swingswung
wringwrung
hang !hung
dig dug
stickstuck
strike struck
heave !hove
reeve *rove
stave *stove
shine !shone
winwon
【その他】
[A-B-C]
dive *dovedived
smite #smotesmit
[A-A-B]
beat #beatbeaten
[A-B-A]
come camecome
runranrun

2016-10-08

違和感を感じた」ってなんでダメなんだっけ?

最近ふと思った

プログラミング説明する

「感じる」っていう関数を考えると、こう書ける

感じる(x)

xの型はもちろん「感じるもの」だ

感じる(カンジルモノ x)

しかし、人間の脳は多態性担保してるので、実際には動的型付けに近い

感じる(var x)

・感じる(暖かさ)

・感じる(力強さ)

・感じる(お昼ご飯)

・感じる(猫)

・感じる(波)

渡されたものが、カンジルモノではなかった場合

人の脳内で渡されたオブジェクトカンジルモノにキャストする(解釈する)

これが基本的自然言語理解仕様だ。

この時、当たり前だが渡されるものカンジルモノである方が、受け手にとっては簡単だ。

まり

感じる(◯◯感)=◯◯感を感じる

というのは非常に理解やす

理解やすいのに、世間ではNG表現となっている

恐らくこれは単に「ダサいから」だろう

「かっこいいコード」をありがたがり、「分かりやすコード」を否定するプログラマーがいるが

あれと同じだ。

ちなみに、感じる(◯◯感)に、そのまま◯◯感を入れるのはバカっぽいというのは分かる

isEmpty(String x)に、isEmpty(string)と渡すより、isEmpty(name)などと

変数名を分かりやすものにした方がいいという主張は分かる

今回の場合はisEmpty(nameString)に近いが。

ただ、「渡すものnameStringという名前からisEmpty(String x)よりisBlank(var x)に渡したい」

というのは意味がわからないだろう?

違和感が◯◯感だから、『感じる』じゃなく『覚える』を使おう」

という主張はそういうことを言っているのだ。

と言うわけで「違和感を感じた」はそれほど悪くないと思う

もちろん「違和感じる」という言葉があれば解決することなのだが

2016-08-30

例外の正しい使い方ってなんだよ。。。

↓こういう実装って駄目なの?

void sample(String str){

try{

str = str.replace("test","");

}catch(Nullpointerexception e){

str ="abc";

}

}

2016-07-30

http://anond.hatelabo.jp/20160730155428

悪い、昼間っからビール飲みだしたから、もうよくわからん

それをそのままってのが意味がよくわからんけど、

newしてから渡せば良いと思うよ。

いちいちクラスに分ける理由は、こういう感じで、クラス内の変数アクセスすれば、画面事の表示とかが簡単に出来る的な?

EventHogeクラスクリックした時のイベント定義するクラス

      // Javaの書き方しらん、インターフェース実装することを定義したい

      public class EventHoge : View.OnClickListener {

        

        //画面事の名称

        public string ViewName = "";

        // Javaの書き方しらん、インターフェースメソッド実装することを定義したい

        public void View.OnClickListener.onClick(View v) {

            // 元増田サンプルそのまま ーー>

            AlertDialog.Builder dlg;

            dlg = new AlertDialog.Builder(MainActivity.this);

            dlg.setTitle("画面の名前:" + ViewName); // 画面名称が表示されるイメージ

            dlg.setMessage("Hello, サンプル!");

            dlg.show();

            //<ーー

       }

     }

MainHogeクラス(画面の初期化を行い、どのボタンにどのイベントを仕込むかを決めるクラス

    // Androidなにも知らんけど、元増田ボタンイベントを書く処理が書いてあるクラスのことが言いたい

    public class MainHoge {

        // そのメソッド

        public void Main() {

            //ボタン実装サンプル

            final Button button = new Button(this);

            button.setText("ダイアログの表示");

            View.OnClickListener ocl = new EventHoge();

            ocl.ViewName = "画面その一";

            button.setOnClickListener(ocl);

        }

    }


こんな感じにすれば、画面が二つあって、

その画面の名称を表示するようなボタンを、二つメソッドコピペして作らなくていい的な?

もうぶっちゃけ元増田が何を悩んでるのか、ようわからんわ。

サンプルは、出来るだけとっちらかさないよう、匿名クラスとか使って、サンプルで紹介したいところ「だけ」を書くんだよね。

から、そのサンプルがどういう意味かをちゃんと読み取って、自分ならこう書くとか、こう書けるか? とかを考えてこそ勉強だと思うよ?

今回のレイだと「View.OnClickListener」っていうインターフェイス実装したクラスを、setOnClickListenerすればいいってことさえわかれば、

匿名クラス?(っていうのかな? ちょっと用語はよくしらん、クラス定義を使い回さず、その場だけのクラス定義を書く書き方)とかを使わずに、

どういうふうに応用ができるか? とか頑張れ!

頑張れ!

頑張れ!

はああああああ。

おれはビールを飲む!

2016-07-25

gitにおけるコミットログ/メッセージ例文集100

私はコミットログの書き方に悩む英語の苦手な人間である。実際、似たような人は世の中に結構いるようで、頻出単語を集計したりまとめたものは既にあって役に立つのだけれど、これらはあくま単語の話であり、具体的な文を構成する過程でやっぱり困る部分がかなりあった。

要するに、どういう時にどういう文が使われているのか、ということを示した例文集が欲しいのであるググると他にも「例文集があればいいのに」みたいな声はあるくせして、しかし誰も作ろうとしない。何なんだお前ら。それじゃ私が楽できないじゃないか

仕方なく自分でまとめたので、増田に垂れ流しておく。

はじめに

ここで挙げているコミットログは全て実際のコミットログから転載である。当然ながら各コミットログ著作権はそれぞれの書き手にある。いずれも各英文でググれば出てくるし、フェアユース範囲なら許してくれるだろうと考え名前プロジェクト名は割愛したが、ここにお詫びと感謝を述べておきたい。

抽出条件だが、参考にできそうなコミットログを多く含んでいそうなリポジトリGitHubSTARの多い方からざっと目で見て適当に選び、それぞれ最新コミットから5000件抽出した(あわせて前処理として、コミットログ冒頭のタグ情報は消去した)。

結果として対象としたリポジトリは以下の通り。

atomのみ5400件抽出していたため、計25400件のコミットログベースである。このうち、以下の条件に合致するものは参考例にすべきでないとして一律排除した。

こうして残った8540件を眺めながら、適当に切り出したのがこの用例集である個人的に「うーんこの」と思った表現も、散見される場合は載せた。

ということで、以下用例を羅列していく。

用例集

オプションフラグメニューを追加した
ファイルを追加した
メソッド機能を追加した
実装を別のものへ切り替えた
  • Use args.resourcePath instead of args.devResourcePath
  • Use arrays instead of while loops
  • Use auto instead of repeating explicit class names
  • Use weak pointer instead of manual bookkeeping
  • Change all uses of 'CInt' to 'Int32' in the SDK overlay
  • Change Integer#year to return a Fixnum instead of a Float to improve consistency
新しく何かに対応した/機能上の制約を取り払った
何かを使うようにした
より好ましい実装に改良した
何かを出来ない/しないようにした
  • Don't bail reading a metadata instance if swift_isaMask isn't available
  • Don't exit until the parent asks for an instance
  • Don't include Parent pointer in Nominal/BoundGeneric TypeRef uniquing
  • Don't use MatchesExtension for matching filters
  • Don't use ES6 class for AutoUpdater windows class
  • Don't use MatchesExtension for matching filters
  • Avoid `distinct` if a subquery has already materialized
  • Avoid infinite recursion when bad values are passed to tz aware fields
オブジェクトの内容や挙動確認やすくした
Assertを追加した
不要コードを除去した
コードを移動した
名前修正した
さなバグタイポ修正した, 警告を潰した
バグや好ましくない挙動修正した
テストコメントドキュメントを追加した
テストを削除した
テストコメント修正した
ドキュメント修正した

表現傾向とまとめ

以上の用例をふまえ、今回の参考ログ8540件から先頭の単語を出現回数で並べると次のようになった。

Add1149
Fix1014
Update584
Remove566
Use382
Don't260
Make228
Move178
Change103
Rename85
Improve76
Avoid68
Allow65
Implement60
Handle58

コミットログの基本形はもちろん動詞 + 名詞である名詞固有名詞複数形、不可算名詞が多いが、単数形場合冠詞は a が使われるか、あるいは省略される。the はまず使われない。

何かを追加した、という表現では非常に広く Add が使われる。メソッドからテストドキュメントに至るまで大概これでまかなえる。

一方、何かを修正した、という表現では広く Fix が使われる。「何か」は typocrash といった単語からメソッド名まで幅広い名詞を取るが、動名詞はあまり取らないのと、that節は取らないのでその点は注意が必要である

Fix は「何かが正しく動くようにした」ことを示し、正しい動作内容が何かを説明しない。そこで正しい動作内容に言及したい場合Make sure が使われる(こちらはthat節が取れる)。ただし Fix よりもニュアンス的に重い表現と思われ、Fix を使わず Make sure ばかり使うのはちょっとキモいのではないかと思う(Ensure はさらに重い表現っぽい)。

また、Fixtypo 以外でのドキュメント修正に対して使われることは稀である。対して Update はドキュメントコメントテストに使われ、本体コード修正に対しては使われない。本体コード修正にあわせてテスト更新したなら Update が使われる。ただ、テスト機構それ自体バグ修正したなら Fix である

無駄な何かを単純に除去したなら Remove を使う。これまでのもの(A)からのもの(B)に切り替えたのであれば Use B instead of A か Change A to B が使われる。新たに何かを利用するようにしたのであれば Use を、利用を取りやめた場合Don't use を使うことが多い。

何かをしないようにしたなら Don't を、内部実装効率化なら Make A + 比較級/形容詞Improve が使われる。

中身の変更を伴わない単なる名前の変更なら Rename A to B、コード機能論理上の場所を移動させたなら Move A to B である

この辺はリファクタリングと呼ばれる行為と思うが、Refactor というぼんやりした動詞はあまり使われず、このように変更内容の種類に応じて動詞が使い分けられている。

余談

コミットログにはWhyを書くべきだ、というのを何かで見かけたので because とか since を使ったログがどの程度あるかを調べたが、8540件のうち22件だった。基本的に短く、シンプルに、一目で意味が取れるログが好まれる傾向がある。例えば get rid of とか2件しか使われておらず、圧倒的に remove である

一方で、シンプル単語だけど開始単語としては使われないものもある。例えば次のような単語である。Expand(9)、Extend(8)、Print(5)、Optimize(5)、Publish(4)、Append(4)、Modify(3)、Manage(2)、Revise(2)、Dump(2)、Insert(2)、Migrate(2)、Enhance(1)、Edit(1) 。いずれもカッコ内は8540件に対する冒頭での登場回数である。結局、より一般的平易な単語で表せたり、Refactor同様に抽象度が高すぎると使われないのだろう。

おわりに

8000件もログを見たおかげで、迷いなくコミットメッセージが思いつくようになったのが個人的には今回書いてて最大の収穫だった。たぶんカンニングペーパーを作る行為それ自体効率のいい学習になるという話と同じだと思う。

このまとめも100以上用例を転載してあるので、それを読むだけでも多少は効果があるんじゃないかと思う。同じようにコミットログ書きたくねぇなぁ英語わっかんねぇなぁと思っている人にとって、何か役に立つところがあれば幸いである。

2016-06-17

1.0から学ぶJava

タイトルを見て釣られクマーな皆さんこんにちは

ホッテントリメーカーで作るような煽りタイトルって、みなさんもう見飽きてると思うんですよね。

今調べたらホッテントリメーカー2008年だそうで。どうりでねー。古臭いなーと思いましたよー。

「一から学ぶJava」ってのをね、1.0にするだけでこんなに素敵なタイトルになるんだから面白いですねー。

タイトルを思いついただけだったんですけど、思いついたらやっぱりちゃんと中身も書かないと行けないじゃないですか。やだー

面倒くさいんですけどね。ちょっと1.0から学んでみましょうか。

Java 1.0 1996年1月23日

Javaの1.0がリリースされたのは1996年1月23日ですね。発表されたのが1995年5月23日でJavaの誕生日といった場合にどちらを取るかで揉めることがあります。

かれこれ20年前なわけで、当時のパソコンというとハードウェアはCPU が Pentium 133MHz メモリ16M とかそんな感じだったかなあ。今どきの携帯電話の例としてiPhone 6sを挙げるとCPUが1.85GHz メモリ 2G ってんだから凄いですね。OSは1995年11月23日リリースされたWindows95とかそんな時代背景です。インターネットがようやく一般に普及し始めたところでしょうか。

今から思うと相当弱いハードウェアですけども、そろそろVM方式を採用しても良さそうな、そんな時代でした。インタープリタだと流石に遅い、でもC言語のようなコンパイル言語だと"Write once, run anywhere"とはいかない、という判断もあったのだろうと思います。Javaが純粋なオブジェクト指向言語ではなくintなどのプリミティブ型を持つというのは、当時のマシンスペックを考えた場合、ある程度妥当な判断だったと言えるでしょう。これが後々苦しくなってくるわけなのですが。

Javaを作った会社はSun Microsystems(サン・マイクロシステムズ)というアメリカの会社で、2010年1月27日オラクルにより吸収合併され今はありません。SolarisというOSとSPARCプロセッサでUNIXサーバーの販売で90年代後半までは一人勝ちのような状況だったと聞きます。当時にすでに「ネットワークこそがコンピュータ」(The Network is the Computer)というモットーを掲げてたんだからおかしい。1996年リリースのJavaが標準でネットワーク機能を備えていたのもこのあたりの思想から来ているのかもしれませんね。

当時のプログラミング言語としてC++が挙げられますが、C++でのプログラマへの負担といいますか、ヒューマンエラーの起きやすさといいますか、その辺を改善する目的で開発されたのがJavaだったわけです。

1996年の時点にこんな言語が登場したのですから革新的でした。

いろんな企業がJavaに賛同します。その中にはMicrosoftもありました。この時期、Microsoftは次期のWindows開発用のプラットフォームにJavaを据えようと考えていました。その後、袂を分かつことになるのですが……。

プログラム言語として構文などを見ると、C++を強く意識した構文なのは間違いなく、しかしポインタ演算を廃してポインタを機能を限定した「参照」に置き換えるなど簡素化が多く見られます。C++からはいろんな機能が削られています。関数ポインタ、構造体、演算子オーバーロードテンプレート((テンプレートについては実装が間に合わなかったという話を聞きます))などなど。そのためC++の劣化であるように揶揄する人もいますが、こうしたものを捨てて言語仕様を比較的小さくシンプルに抑えた点は評価に値すると思います。しかし、今でもこうした削減された機能を愛する人からはJavaを腐す要素として挙げられてしまうのでした。

Java 1.1 1997年2月19日

Wikipediaからピックアップすると1.1での大きな機能追加は

といったところです。当初よりJavaの内部文字コードUnicodeで文字を表すchar型は16bitで設計されていました。Unicodeは当時それほど普及しておらず、Unicode対応のテキストエディタさえ少なかったと記憶しています。時代を先取りしていると言えますが、大きな誤算はUnicodeが当初16bitのコードポイントに世界のあらゆる文字を格納しようとしていたことで、漢字圏の我々からすると16bit=65,536程度の空間に文字が全部入るわけないだろ!というものだったが故に早々に破綻し、Unicodeは21bitのコードポイントに拡張されることになるのです。これはまた後の話。

なんにせよ、日本語が対応されたのは1.1からで、日本でのJavaの採用が始まったのはこの頃からと言えましょう。

当時のJavaのGUIはAWTというものでしたが、これを用いたGUIの開発は当時は結構行われていたイメージですね。Visual BASIC でGUIを作るプロダクトも結構あったと思います。GUIのためのオブジェクト指向言語としてJavaが使われていたイメージがありますね。JavaBeansもそのための仕様でした。件のsetter/getterの話題に繋がっていくのですが。

JDBCはJavaとデータベースをつなぐインターフェースです。RMIではあるJava VMから別のJava VMにオブジェクトを送って実行する、といったことができます。こうした機能が用意されたことで、ソフトウェアフロントとしてのGUI、裏方の実装のためのネットワーク機能、データベース機能、さらにはソフトウェアを配布するためのJava Appletという布陣でJavaでのソフトウェア開発が加速していた時代といえます。

Microsoft Visual J++ もこの時代ですよ。

Java 1.1以降のバージョンのものは互換性確認のためにOracle Java Archiveからダウンロードすることができ、今でも入手することができます。もちろん、Java7ですら2015年4月にEOL(End of Life,サポート終了)となっているので、通常利用するのはJava8としてください(本稿執筆時点)。

当時のドキュメントを見るのも一興です。現在と比べると標準APIがかなり小さい。なお、当時のjavadocは今とはデザインが大きく異なります。

  • java.applet
  • java.awt
  • java.awt.datatransfer
  • java.awt.event
  • java.awt.image
  • java.beans
  • java.io
  • java.lang
  • java.lang.reflect
  • java.math
  • java.net
  • java.rmi
  • java.rmi.dgc
  • java.rmi.registry
  • java.rmi.server
  • java.security
  • java.security.acl
  • java.security.interfaces
  • java.sql
  • java.text
  • java.util
  • java.util.zip

この時代であれば、全パッケージを舐めて標準APIを学ぶこともそう難しくはありませんでした。この時代から触っている人間は新バージョンが出るたびに増えるAPIを順に学んでいけたのです。しかし、現代にJavaを学ぶ場合、どのバージョンでは何があって……というのをいちいち学ぶ必要はほぼありません。Java5以前は一緒くたでいいと思いますし、一部のAPIで歴史的経緯があってねーというのを知っていればおそらく十分ではないでしょうか。

Java 1.2 1998年12月8日

strictfpキーワード浮動小数点演算をやる人は覚えておきましょう。JavaはパフォーマンスのためにCPUの浮動小数点演算を扱うことが許されており、そのため実行するCPUによって精度が異なることがあるんですね。まあ今時のCPUだと大丈夫だとは思うんですが。

リフレクション機能ではJavaのクラスを抽象的に扱うことができます。設定ファイルに書かれたクラス名のclassロードして実行する……みたいなことができるんですね。フレームワーク的なものを作る場合には多用することになります。

1.2からは新しいGUIのSwingが採用されました。AWTがOSごとのGUIパーツを用いていたためデザインに違いがあったのに対し、Swingでは統一的なルック・アンド・フィールが用いられるようになりました。まぁ今ならJavaFXを使うのが良いと思います。

初期のJavaはやはりVM方式の実行速度の遅さが指摘されていました。実行時の構文解析を伴わないだけインタープリタよりは早いものの、実行バイナリを作るC/C++よりは遅い、そうした評価です。ここではサン・マイクロシステムズのVMにJIT(ジャストインタイムコンパイラ)が乗ったことが挙げられていますが、JIT自体は別の会社が先駆けて開発していたことは記しておきたいと思います。

JITコンパイラは実行時にJavaのバイトコードを環境のネイティブコードコンパイルして動かす技術です。この後、JITコンパイラ、動的再コンパイル技術、世代別ガベージコレクションを備えたHotspotといった様にJavaVMは進化していきます。現代では実行時の最適化が進み、大きなスケールで見た場合、Javaの実行速度はC/C++での実装と比べてそれほど遅れるものではありません。遅くても倍の時間は掛からない程度といったところでしょうか。

あとは特記すべきはコレクションフレームワークです。皆が多用しているであろうjava.util.Listやjava.util.Mapといったライブラリが整備されたのがこの時なのです。それ以前はjava.util.Vectorやjava.util.Hachtableというクラスが可変長配列の機能を一手に担っていました。今ではVectorやHashtableは使うべきではありません。

Microsoft 離反

Java の開発はSun Microsystems が主導していたけども、すべてがSunのものだったというわけでもなく。Javaには多くの会社が出資していてその中のひとつMicrosoftだったわけですね。

Microsoft の Visual J++ では delegate とか独自機能拡張もありましたけど、裁判で問題になったのは J++ でコンパイルしたclassファイルMicrosoftのVMでしか動かないという部分ですね(他社製のVMで動くclassファイルを作ることもできる)。classファイルがどこのVMでも動くの大事だろ、"Write once, run anywhere"だろ、お前何してくれてんの!と喧嘩になったわけです。当時のMicrosoftブラウザまわりでも独自拡張がやりたい放題、標準規格?なにそれ美味しいの?みたいなスタンスをあちこちで見せていたものです。

結局、この事件でMicrosoftのJavaはバージョン1.1相当でストップ。好き勝手にやれないなら独自に言語作るわーとばかりに.NET フレームワークと C# といった方向に舵を取ります。

JavaがPC上でのUI開発の主力になろうとした勢いはここで潰えます。

Java EE

Java SE とは別にこの時代に Java EEリリースされていることは特記しておきたいですね。これ以後、それまでのCGIに取って代わって、JavaはWebサービスの開発のプラットフォームとして多用されるようになります。

2000年あたりからはJavaはGUI開発というよりは、Webサービスの開発が主流という流れになっていきます。インターネットサービスが非常に発達していった時代、背後ではとてつもない量のJavaのプログラムが支えていたわけです。ただまあ、こうした産業利用は一般的ユーザーの目にはあまり入らないわけです。一般人からすればJavaといえばJava Appletみたいなイメージはずっと残っていたでしょうが、実体としてはJavaといえばServletという時代になっていたわけです。

企業で用いられる社内システムにもServletは多く採用されました。

理由はいろいろ挙げれると思うのですが

というのが大きな理由だろうと思います。JSPというテンプレートエンジンを用いてHTMLを整形してWebページを作り出す、というアーキテクチャある意味では便利で簡単でした。

もっともHTMLの表現力に足を引きずられるため、GUIの機能性という点では後退したわけなのですが。それでもメリットが大きいと判断されたのでしょう。というか、まともにGUIを組めるプログラマがほとんどいないから、GUIのシステム開発がなかなか成功しないってのもあったんでしょうけどね。

iアプリ Javaアプリ EZアプリ

2000年あたりというと携帯電話の普及も取り上げなければなりません。現代のスマホガラケーに比べれば非常に機能は貧弱で、まさに携帯「電話」でした。要するに電話とメールぐらいしかできなかったんですね。

そこにdocomoiアプリJフォン(ボーダフォンを経て現ソフトバンク)のJavaアプリ、auのEZアプリという携帯電話上でちょっとしたアプリが動くよ!というのが乗るようになってきたんです。これがJavaを組込み用途にコンパクトにしたJava MEというものが土台となっていて(正確にはiアプリちょっと違う)Servletと並ぶJava言語の大きなもうひとつの領域となっていました。

iアプリは当初は容量が10k byteまでといった制約があり、容量制限が非常に厳しかったのですが、新機種が出るたびに容量は緩和されていきました。

docomoiアプリ含めiモードによって一世を風靡します。こうした土台を作ると、その上で商売をしたい人がたくさんやってきて、勝手にコンテンツを作ってくれる。docomoはそれらから手数料を取るので労せずして大金を稼げるというわけです。賭場の胴元というわけです。

この賭場が、将来にAppleiPhone, GoogleAndroidに荒らされることになります。docomoがなかなかiPhoneを出さなかったのもiモードという自前の賭場を失うことを良しとしなかったためです。金づるを失ったdocomoSamsungと組んで独自の携帯向けOSであるTizenの開発に乗り出します。そんなTizenですが鳴かず飛ばず。噂ではインドあたりではリリースされたとか、なんとか。

RIA時代

話を2001年に戻しましょう。

Microsoft離反でGUIのプラットフォームとしてのJavaというものは存在感を弱めていました。この分野の復権に寄与したのはJava 1.4 (2002年2月6日)で導入されたJava Web Startです。

Java Appletブラウザ埋め込みで動作したのに対し、Java Web Startではブラウザから起動しつつも独立したアプリとして起動するのです。

Webシステムが企業の社内システムに採用された話は先に述べたとおりですが、やはりWebシステムのGUIというのはHTMLに引きずられて貧弱だったんですね。

端的に言えば入力値が数字かどうか?みたいなチェックがなかなか難しい。HTML上でJavaScriptでやるわけなんですが、なかなか気持よく入力できるような感じにはならなかったんですね。

また、Ajaxによるブラウザのページ遷移を伴わない通信というのが出てきたのも2005年ぐらいなので、入力値に対してサーバ問い合わせするようなことはできなかった。当時だと一旦画面遷移させないとできなかったわけです。

こうした事情から、クライアントサイド、要するにPC側でもっとリッチなUIが使いたい!という要望があったわけです。Webシステム使いにくい!という不満の噴出と言ってもいい。そこで出てきたのがRIA (Rich Internet Applications)というわけです。

Javaは1.0時代のAppletからそうですが、ネットワークを介して別のPCにプログラムを送り込み、そこで動作させるという能力を持っていました。それこそまさにRIAに求められる機能性だったわけですね。

RIAの代表とされるのは

あたりです。三つ巴の戦い、どこに軍配が上がるのか!?と注目されましたが、勝利したのはHTML / JavaScriptでした。

Google MAP で注目を浴びたAjax技術、それまでブラウザでは不可能と思われていた高級なGUIをHTML / JavaScriptで実現させました。もうやめて欲しいですよね。せっかく脱ブラウザの流れが来たと思ったのにまたWebシステムに逆戻りですよ。

RIAが失速した理由として考慮して置かなければいけないのはスマートフォンの台頭です。RIAでは端末を選ばずどこでも同じアプリが動かせる点がポイントひとつでしたが、スマートフォンではそうは行かない。"Write once, run anywhere"を破壊したのはスマートフォンだったというわけです。

しかし、先日インストールなしでアプリを実行するAndroid Instant Appsが発表されたりしまして、結局RIAの思想といいますか、要求というのは今でも息づいているのだなと思った次第です。

Java 5 (2004年9月30日)

1.3 / 1.4 では機能追加はあっても言語構文が大きく変わることはありませんでした。大きく変わったのはJava 5です。この時からバージョニングが変わって1.5ではなく5と表記されるようになりました。

Java5の特徴はなんといってもジェネリクス。それまでjava.util.Listにデータを出し入れするのにはキャストが必須だったわけですが、ようやくキャストから開放され型の安全度がぐっと高まりました。その他に以下のような変更があります。

言語としては随分変わっったわけですが、もうかれこれ10年以上前のことですからこれらの機能が「Java5から導入された」という知識は今となってはあまり必要とされません。これらの機能が使えないJava 1.4で開発をする事案が殆ど無いからです。0ではないのが悲しいところではありますが。

その後

Java 6 (2006年12月11日)がリリースされた後、Java 7 (2011年7月28日) が出るまでJavaは停滞してしまいます。その間にSun Microsystemsという会社がなくなってしまったためです。

Sun Microsystems の経営状況が悪化しており、ついに身売りをすることになりました。身売り先はIBMともGoogleとも噂されましたが結局2010年1月27日オラクル吸収合併されました。

Javaの停滞中にはJava VM上で動く非Java言語も台頭してきました。Scalaなどですね。

やや戻って2007年Androidが発表されます。Androidの開発言語にはJavaが採用されていますが、実行環境はJava VMではなく、ライセンス的な事情でJava(TM)は名乗らない微妙な位置関係にあります。

Java 5 以降で大きく言語仕様に手が入るのは Java 8 (2014年3月18日)です。並列処理を行うためのStream APIと、そのために簡易に関数を定義するためのラムダ式が導入された点が大きいですね。日付APIも刷新されました。

このように、Javaは1.1の黄金時代から今に至るまで利用ジャンルを転戦しながら産業の土台となって支えてきた歴史があります。ジャンルの趨勢により浮き沈みもあります。今後についても決して楽観視はできないでしょう。Javaを学ぶことはプログラミングを学ぶステップとしては意義はあると思いますが、Javaを学べばゴールというわけではありません。プログラム言語次世代へと移りつつあります。業界動向には注視していきましょう。

2016-05-12

memo

Web + DBより

Git

コミットを遡る指定
HEAD ~1

HEADの親

HEAD ~2

HEADの親の親

HEAD ^1

HEADの1番目の親

HEAD ^2

HEADの2番目の親

コミット指定する方法
HEAD

現在ブランチの最新コミット

ORIG_HEAD

git merge や git reset でHEADが移動してしまう.

ORIG_HEADを使うことで移動前のHEADを指定できる.

FETCH_HEAD

git fetch によってリモートリポジトリから取得した最新のコミット指定できる.

変更履歴確認する方法
git log --oneline

logを一行で表示する.

git log --decorate

tag名前ブランチマージ履歴を表示する.

git log --follow FILENAME

FILENAMEファイルの変更履歴を,たとえ途中でリネームされたとしてもそれも見る.

git log --author &lt;name&gt;

nameログ検索できる.

git log --graph

ブランチコミットグラフを表示する.

git log -p

コミット差分を表示する.

差分を見る
git diff &lt;base commit&gt;...&lt;opposit commit&gt;

コミット差分を表示する.

トリプルドット指定する必要がある点に注意しましょう.

問題のあるコミットを探す
git log -S "string"

履歴string検索する.

git bisect start &lt;bug commit&gt; &lt;correct commit&gt;

二分探索の開始

git bisect good

提示されたコミットが正しい挙動を示すとき

git bisect bad

提示されたコミットが正しくない挙動を示すとき

git bisect reset

二分探索の終了

rebase
git checkout &lt;branch name, needs to be rebased&gt;
git rebase &lt;base of rebase&gt;

rebase

注意
git pull --rebase

git pull は git fetch + git merge

merge ではなく rebase したい場合に利用するのがよい.

git log --merge

コンフリクトを発生させたコミットを表示する.

高度な機能
git stash

内容の退避

git stash pop

退避した内容の復活

git stash list

退避した内容の一覧

git worktree

作業ワークツリーの追加

git submodule

外部のリポジトリ管理する

git rebase -i HEAD~N

Nは自然数

過去コミットを消したり編集したりする.

最新からN個まえのコミットまでを対象編集できる.

編集時にエディタが開くが,編集を終えてエディタを閉じてもrebase機能しないことがある.

その場合は次のように, .gitconfig へエディタパスを書けばよい.

   [core]
     editor = /usr/bin/vim
フック

2016-04-16

ブルースクリーンを初めて見た若者お話

あこがれの英字キーボードを手に入れたから早速会社パソコン接続してみた。会社パソコンWindows 7解像度メモリCPU悲劇的な支給パソコンをなんとか使えるレベルで動かしてくれる頼もしいやつ。

「カシュカシュカシュ」

う〜ん、シングルクォーテーションとダブルクォーテーションがうちやすい! あとアットマークシフトを押しながら入力するのは新鮮かな。

「コトコトコト」

スペースキーが広い! 打ちやすい! ついつい連打しちゃうキー配列になれるのは時間がかかりそうだけどハッカーみたいでかっこいい。だけどちょっと、ううん、かなりストレスフルなことが一点あって、日本語入力しようとしたらキー配列JIS配列なっちゃうんだ。いちおう英字配列にはキーコンビネーションで切り替えられるんだけど、キートップの印字とちがうじゃない。ほら '*' が '(' だったりさ。


今思えば英語入力にわりきって使えば良かったって思うよ。でも往々にしてわりきるのって無理でしょ。


こまったときグーグル頼み。グーグルさんに日本語キーボードパソコンで外付け英字キーボードを上手く使う方法はないのって聞いてみた。そうしたらいろいろおすすめしてくれたから、まあ、このくらいの苦労はしないと英字キーボードを買った意味はないよねって、というかこっちから苦労を買ってやろうって、ふふんと思いながらいろんなページを確認したの。業務中だったけど。


それで、レジストリを書き換えてやればいいって書いてあるページを見つけた(http://blog.heiichi.com/?eid=792239)。書き換えるのは

パス : HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/i8042prt/Parameters
キー : LayerDriver JPN, OverrideKeyboardIdentifier, OverrideKeyboardSubtype

か。でもレジストリエディタってなんか使いづらいし、怖いなあ。おっとそういえば業務デファクトスタンダードアプリ Excel で、拡張コンテキストメニューから「読み込み専用で開く」ためにレジストリを書き換える PowerShell スクリプトを作ったんだっけ。マイクロソフトオフィスアップデートするたびにレジストリ書き換えられるもんだから、あたまにきて作ったんだっけ……。

New-ItemProperty -Force -Path 'Registry::HKEY_CLASSES_ROOT/Excel.Sheet.12/shell/OpenAsReadOnly' -Name ddeexec -PropertyType String -Value "[open("%1",,1,,,,,,,,,,,,1,,1)]"

よっし、エンジニアならコンポーネント再利用だな、ってスクリプトコピーしてぺたぺた(スクリプトは超危険なので割愛!)。パスをかえて、値はこれで、そうそ現在の設定を確認して英字配列日本語配列自動で切り替えるようにしたいな、むふふ、なんてつなげたばかりの英字キーボードですくりぷとすくりぷと書いていたの。


そんで実行。エラーか。ふむふむああええおお、パスまちがえちゃった。


こんどこそ実行。エラーなく終わって、ちゃんとキー名前と値が入っている。さてさてそれでは再起動しましょう。


「ブイーン」


これ面倒なんだよなー。ハードディスク暗号化解除っと。あれ、起動画面に移らないなあ。メモリチェックが走っているのか。ふーん。


……おわらないんだけど………………………………………………。おそるおそる画面をみたら、


Windowsが起動できませんでした。システム管理者に連絡してください。」


うっわーーー。ブルースクリーンだーーー。はじめて見たーーー。本当にブルースクリーンででるんだなあ。

正直このときラピュタをみつけたパズーの気分だったかも。ぼくの場合はこの先にはわくわくなんてなかったけどさ。だんだん、やべー、これやべー、これやべーや、これすごくやばいよね、って正気にもどった。そんで隣のお仲間にバレる前に強制終了。ふう。多分再起動だっておもってくれたよね。

だいじょうぶだ Windows軍用にも使われる堅牢性の高い OS だ。これくらいのエラー普通再起動したらいつもと同じように退屈な起動プロンプトがでるはず。そうやって自分をまず信じる。それが一番大事

まずは軽い深呼吸。そして電源オン。


「ブイーン」


ハードディスク暗号化解除は BIOS レベルから変わらないのか。Windows は予期されない終了をしたって? そのとおり! 気にせずに君はいものように平常心で起動してくれたまえ。


ブルースクリーン RETURNS!!!


あかんわ。これ完全にあかんわ。二回起動して二回だめって、これなんかいやってもダメパターンはいったよね。エンジニアのはしっくれだけどそれくらいはわかる。

とりあえず電源を落として、気持ちを落ち着かせるために散歩しよう。ああ、今日は雲がきれいだなあ。風もふいていてはるだなあ。どうしよ。ぼくも答えはわかっていたんだけどね。管理部にごめなさいしてリカバリ DVD をかりてくればいいんだよね。でもさ、ただの箱になったパソコンお客様のものっていう派遣立場だしさ、絶対に原因追求でレジストリいじったことを告白させられるしさ、ああなんか春と秋ってにてるよね。

あとさブルースクリーンになった原因もわかったの。ふいにあああれだなって思い浮かんだんだけどさ、スクリプトかいまわしちゃったせいで OverrideKeyboardSubtype キーの型を DWORD じゃなくて String にしてたのよ。ぜったいにこれで起動シーケンスで致命的エラーはいてんだろうなって。

そんな風に思いながら、自席に戻って、もう一回電源起動。もう一回よく画面を確認する。……むむ自動修復だと。よかろう最後の望みだ。かなえてやろうじゃないか。へー最後に記録した正常状態システム復元するのか。なんか説明書きに「最近インストールしたプログラムとか消えるかもね。ハハッ。」て書いてあるけど、しばらくインストールなんてしていないし、初期状態に戻んなかったらまあいいよって感じ。ポチッとな。


そんでもって三十分から時間経ったかなあ。あまりにも時間がかかるからトイレの個室で頭をかかえてたの。自席に戻るとパソコンの電源が落ちているわけ。さてとこれはラストチャンスだ。なんのチャンスかわかんないけどラストであることはあきらかだよね。そして電源をいれた。

この時ばかりは神様に祈ったね。だって計算機プログラムしたようにしか動かないから、お祈りなんてしても意味ないもんね。だから神様にお祈りしたの、どうかおねがいします、今後はこれにこりてレジストリなんてぜったいにいじりませんので、この計算機が正しく動くことを祈ってくださいって。


結局、無事復旧できた。なにひとつ異常なく Windows 7 は立ち上がって来て、みなれた壁紙がでてきた。おそるおそるレジストリ確認したら、ちゃんとぼくがいじくるまえにもどっていた。ありがとう Windows! ありがとう自動修復機能! いちおうありがとう神様


教訓



おまけ1

それでも外付け英字キーボード日本語入力したいんだーて人はここらへんを見たら幸せになれるよ。

USB英語キーボード付けた。(英語日本語キーボード共存、KeyboardTypeOverride) 202122 (http://202122.iku4.com/%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3/%EF%BD%95%EF%BD%93%EF%BD%82%E8%8B%B1%E8%AA%9E%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E4%BB%98%E3%81%91%E3%81%9F%E3%80%82%EF%BC%88%E8%8B%B1%E8%AA%9E%E3%80%81%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89)

USBポートに対しての設定だからブートで失敗することはないと思うよ(ブルースクリーンを発生させたもののことば)。


おまけ2

いちおうこれを書くにあたって、自宅のパソコン Windows Vista再現できないかためしてみた。検証内容は以下の二つ。

  1. ちゃんと正しい設定をするとブルースクリーンが発生しないか。
  2. 原因と思われる DWORD と String の間違いを検証レジストリキーの型を DWORD から String に変更したらブルースクリーンが発生するか。

結論としては両方とも大成功! ちゃんとレジストリエディタから編集したら、英字キーボード日本語入力が快適にできるようになったし、 DWORD を String に変更したらブルースクリーンがでるようになったし! Vista だと会社Windows 7 ではできた自動修復ができないし! なんかブートセクションとデータセクションが分けられるようになったのって Windows 7 かららしいし!


だけどここは会社じゃなくて自宅だから、メイン OSUbuntuWindows 領域マウントして華麗に chntpw を叩いてレジストリを修復できる。そう Linux ならね。

2016-04-13

VBAは誰かの愛で動いている

エクセル関数で出来ないことはVBAの登場である

我々のような事務職にとって、VBAですら使いこなすことは

必ずしも良い結果をもたらさない。

"専門職ぶっている"

"自分範疇のことしか興味がない人"

"可愛くない奴"

こうみなされる危険性がある。

自動記録でのマクロ保存はOKだ。

もしくは、ネット上の誰かのコメントちょちょっと修正する。

Dim 愛 as String

Dim Japanese as Variant

'愛・覚えていますか?

おれのマクロが動いているのは、ヤフー知恵遅れの住人のおかげだ。

みんなありがとう

2016-04-01

月刊Vim 3月号 - ゼロ除算編

:echo 1 / 0
:echo 0 / 0
2147483647
-2147483648

きっしょwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

他の言語もチェックしてみるか

golang

package main

import "fmt"

func main() {
	fmt.Println(1 / 0)
	fmt.Println(0 / 0)
}

division by zero

php

echo 1 / 0;
echo 0 / 0;

PHP Warning: Division by zero

python 2

print 1 / 0
print 0 / 0

ZeroDivisionError: integer division or modulo by zero

python 3

print(1 / 0)
print(0 / 0)

ZeroDivisionError: division by zero

nodejs

nodejsだと1/0と0/0で異なるメッセージが表示された。

console.log(1 / 0);

Infinity

console.log(0 / 0);

NaN

luajit

luajitだとnodejsで表示されたメッセージの短縮形で表示された

print(1 / 0)

inf

print(0 / 0)

nan

haskell

修正しました thx @anekos

main = do
    print(1 / 0)

Infinity

main = do
    print(0 / 0)

NaN

java

public class Test {
    public static void main(String[] args) {
        System.out.println(1 / 0);
    }
}
public class Test {
    public static void main(String[] args) {
        System.out.println(0 / 0);
    }
}
Exception in thread "main" java.lang.ArithmeticException: / by zero
        at Test.main(Test.java:3)

bash

#!/bin/bash

echo $((1 / 0))
echo $((0 / 0))
test.bash: 行 4: 1 / 0: 0 による除算です (エラーのあるトークンは "0")
test.bash: 行 5: 0 / 0: 0 による除算です (エラーのあるトークンは "0")



haskellnodejsとluajitはエラーにならないけどまあいい。

Vimはやべえよ。


結論言語わずゼロ除算はするな









しまった、4月だった。

アーカイブ ヘルプ
ログイン ユーザー登録
ようこそ ゲスト さん