テレビはアプリであるべきか?
最近、またテレビブームが来そうな兆しがある。
Apple、Google、Amazonなどなど、いろんなメーカーがこぞってテレビに接続できるデバイスを発表している。
また、動画配信サービスが日本でも充実してきている。netflix、Hulu、Amazon、日本のサービスもいろいろとでてきた。
これは、テレビメーカーも嬉しいところだろう。リモコンにnetflixボタンが付く日もそう長くはないのかもしれない。
テレビは、まさに今進化するべきところにあると思う。もう、テレビが登場してからずいぶんと変わっていない部分もある。見たい時に、好きな番組が見れないし、CMもあるし、地域によっても変わってくる。
テレビがアプリになることで、そういうのを全部変えてくれそうな気がしている。ていうか変えて欲しい。ネットワークとか、いろいろ問題が出てくるのだろうが、基本的にはマイナスことはないと思っている。まぁ、大人の事情みたいなことがいろいろあるんだろうが、一部の人しか得しない構造より、みんなが楽しめるエンターテイメントを作っていって欲しいものだ。
今後どういう方向になっていくのか楽しみだ。
【いろんな言語で書いてみた】文字列内に出現するすべての空白文字を”%20”で置き換える関数
今回は、与えられた文字列に空白があった場合は、その空白部分を「%20」に置換する関数を作成する。 与えられた文字列の中で、特定の文字を置換する処理はよくあることだと思うが、じっさいに自分で書いてみるとどうなるのだろうか。
PHP
PHPだと文字列の長さを取得して、for文で1文字ずつ取得その1文字が空白がどうか調査する。
<?php function replaceSpaces($str) { $length = mb_strlen($str, "UTF-8"); $rs = ""; for($i=0; $i<$length; $i++) { $val = mb_substr($str, $i, 1, "UTF-8"); if($val == " ") { $rs .= "%20"; } else { $rs .= $val; } } return $rs; } $str = "a b cd e"; var_dump(replaceSpaces($str));
JavaScript
- JSの場合だと、splitで配列にできるので、その配列を長さ分for文で回し、空白判定する。
function replaceSpaces(str) { var strs = str.split(""); var i, rs=""; for(i=0; i<strs.length; i++) { if(strs[i] == " ") { rs += "%20"; } else { rs += strs[i]; } } return rs; } var str = "a b cd e" console.log(replaceSpaces(str));
Ruby
# coding: utf-8 def replace_spaces(str) rs = "" str.chars { |s| if s == " " then rs += "%20" else rs += s end } return rs end str = "a b cde " puts replace_spaces(str)
Python
#!/usr/bin/env python # -*- coding: utf-8 -*- def replace_spaces(str): rs = "" for num in range(len(str)): if str[num] == " ": rs += "%20" else: rs += str[num] return rs if __name__ == "__main__": str = "ab c d e " print replace_spaces(str)
Go
ackage main import "fmt" func replaceSpaces(str string) string { >-var rs string = "" >-for _, s := range str { >->-if (string(s)) == " " { >->->-rs += "%20" >->-} else { >->->-rs += string(s) >->-} >-} >-return rs } func main() { >-var str string = "a b c d e f" >-fmt.Println(replaceSpaces(str)) }
Elixir
# # 文字列の中にスペースがあれば、「%20」に置き換える # defmodule ReplaceSpaces do def main(str) do length = String.length(str) replace(str, 0, length, []) end defp replace(str, count, length, replace_strs) do if count < length do val = String.at(str, count) if val == " " do val = "%20" end replace(str, count+1, length, [replace_strs|val]) else replace_strs end end end str = "a bcd ef g " IO.puts String.length(str) IO.puts str IO.puts ReplaceSpaces.main(str)
ALLANDのターバン
ゆげ塾の構造がわかる世界史
世界史の勉強でもしようと、この本を買ってみた。
Amazonでも評価が高かったし、Podcastで人気の「世界一周!チラ見の世界史」でも紹介されていたので、読んでみた。
いきなり、坂本龍馬と南北戦争の関わりからはじまり、なるほどそういうことか!と、一見関係なさそうな話題から始まり歴史を遡っていくという展開。
とてもわかりやすく、しかも、飽きないように面白く書いてあった。
もちろん、まとめまくっているので、完全な歴史とは程遠いが、それでも要点は付いていると思うので、なるほどー、そういうことかーと思うことがあって、とてもおすすめできる本だと思う。
歴史を知るというのはとても大事なことだと思う。なんで今争いが生まれているのか?とか、文化の違いなど、それぞれに理由があるのだということ。
歴史とか、ぜんぜん好きではなかったのに、年をとると興味がでてきますね(笑)
【いろんな言語で書いてみた】パッケージ管理
それぞれの言語で、もちろんいろんな人が作ったライブラリ等を使いたい場合がある。その時に、どうやってそのソースを持ってきて、どうやって管理するか?という問題がある。
もちろん、自分でダウンロードして、適所に置くでもいいのだが、一人で開発する場合、これでもいいかもしれない。
でもやっぱり、複数人で開発するとなるとパッケージ管理が必要になってくる。今回は、各言語ではどのようなパッケージ管理の仕組みが用意されているのか調べていこう。
PHP
composer
PHPではpearが有名だが、最近はcomposerが主流になっている気がする。
pearだとOS単位でインストールしないといけないのだが、composerだと、プロジェクト単位でインストールできるのがいいところ。composerダウンロード
$ curl -sS https://getcomposer.org/installer | php
composer.pharがダウンロードさせる。こいつを使ってパッケージ管理していく。
composer.jsonにインストールしたいパッケージを記述
{ "require": { "mockery/mockery": "*", "facebook/php-sdk": "v3.2.3" } }
- composer.pharを使ってインストール
$ php ./composer.phar install
上記のコマンドでライブラリがダウンロードされる。
もう一つは、「composer.lock」というファイルが作成される。
composer.lockファイル インストールしたときに、パッケージの実際のバージョンのリストをこのファイルに書き込みます。
これでプロジェクトを特定バージョンにロックすることができるようになり、新しいバージョンがあってもアップデートしないようになる。では、新しいバージョンにアップデートしたい場合はどうするか?
$ php composer.phar update
上記の「update」コマンドでjsonファイルに書いてある最新のバージョンにアップデートし、lockファイルを更新してくれる
- 最後にダウンロードしたライブラリをオートロードできる
<?php require 'vendor/autoload.php';
* composerも、jsonの書き方とか、様々な書き方ができるので、公式ページ等で調べていただけたらと思う。
JavaScript
npm
- node.jsのパッケージを管理するためのツール
- npmのインストールは、最近のnode.jsをインストールすれば一緒に入ります
Bower
- フロントエンド用のパッケージを管理するためのツール
- Bowerのインストールはnpmから
$ npm install bower -g
Ruby
Bundleとは
- Ruby on Railsをインストールすれば、Gemfileというファイルが作成される
- このGemfileに必要なパッケージを記述していく。これを周りに配布することで同じ環境を構築することができる。
- bundleは、この仕組を提供してくれるもの。Gemfileに記載したパッケージをインストールしてくれる。
$ bundle install
- インストールされたらGemfile.lockが生成される
Python
- pipというパッケージ管理ツールがある
$ pip install --user virtualenv
Go
- ソースファイルに直接、パスを記述する
import ( "os" "github.com/codegangsta/cli" )
- go get コマンド
go get github.com/kr/goven
Elixir
- Hex というパッケージ管理ツールがある。mixコマンドインストールする
$ mix archive.install https://github.com/phoenixframework/phoenix/releases/download/v0.16.1/phoenix_new-0.16.1.ez
- ここにpkgが登録されている https://hex.pm/
【いろんな言語で書いてみた】与えられた2つの文字列がアナグラムであるか判定する関数
PHP
<?php /** * アナグラム判定(ただし、半角英数字のみ) * * @param string $str1 * @param string $str2 * @return boolean */ function isAnagram($str1, $str2) { $strs1 = _sort($str1); $strs2 = _sort($str2); if($strs1 !== $strs2) { return false; } return true; } /** * 文字列の中のスペースを除去して、aから順にソートする * @param string $str * @return array */ function _sort($str) { $str = str_replace(" ", "", trim($str)); $strs = str_split($str); $strs = array_filter($strs); sort($strs); return $strs; } $str1 = "anagrams"; $str2 = "ars magna"; var_dump(isAnagram($str1, $str2));
JavaScript
/** * アナグラム判定 */ /** * Anagramクラス * * @param [string] str1 * @param [string] str2 */ Anagram = function(str1, str2) { this.str1 = str1; this.str2 = str2; } /** * アナグラムかどうか判定 * * @return [bool] */ Anagram.prototype.isAnagram = function() { strs1 = this._sort(this.str1); strs2 = this._sort(this.str2); if(strs1.toString() != strs2.toString()) { return false; } return true; } /** * 文字列を配列にしてソート * @param [string] str * @return [array] */ Anagram.prototype._sort = function(str) { return str.trim().replace(" ", "").split("").sort(); } var str1 = "anagrams"; var str2 = "ars magna"; var anagram = new Anagram(str1, str2); console.log(anagram.isAnagram());
Ruby
# coding: utf-8 # # 与えられた2つの文字列がAnagramかどうか判定する # # 与えられた2つの文字列がAnagramかどうか関数(ただし英数字のみ しかも小文字) # @param [string] str1 文字 # @param [string] str2 文字 # @return [bool] def is_anagram(str1, str2) strs1 = _sort(str1) strs2 = _sort(str2) if strs1 != strs2 return false end return true end # 文字列を配列にし、aから順にソートして返す # @desc timrして空白除去して、配列にして、ソート # @param [string] str # @return [array] def _sort(str) return str.strip.delete(" ").split("").sort end str1 = "anagrams" str2 = "ars magna" puts is_anagram(str1, str2)
Python
#!/usr/bin/env python # -*- coding: utf-8 -*- def is_anagram(str1, str2): strs1 = _sort(str1) strs2 = _sort(str2) if strs1 != strs2: return False return True def _sort(str): str = str.strip().replace(' ', '') strs = list(str) strs.sort() return strs if __name__ == "__main__": str1 = "anagrams" str2 = "ars magna" print is_anagram(str1, str2)
Go
package main import "fmt" import "strings" import "sort" import "reflect" func _Sort(str string) []string { >-str = strings.Trim(str, " ") >-str = strings.Replace(str, " ", "", -1) >-strs := strings.Split(str, "") >-sort.Strings(strs) >-return strs } func IsAnagram(str1 string, str2 string) bool { >-strs1 := _Sort(str1) >-strs2 := _Sort(str2) >-if reflect.DeepEqual(strs1, strs2) == false { >->-return false >-} >-return true } func main() { >-var str1 string = "anagrams" >-var str2 string = "ars magna" >-// 文字列を逆にする >-fmt.Println(IsAnagram(str1, str2)) }
Elixir
# # 2つの文字がアナグラムかどうか判定する # defmodule IsAnagram do def main(str1, str2) do strs1 = _sort(str1) strs2 = _sort(str2) if strs1 != strs2 do false else true end end defp _sort(str) do str = String.strip(str) str = String.replace(str, " ", "") strs = String.split(str, "") strs = Enum.sort(strs) strs end end str1 = "aanagrams" str2 = "ars magna" IO.puts IsAnagram.main(str1, str2)