apt-getの使い方

liquidfunc2011-05-03


apt-getはUbuntuのパッケージ管理システムです。インストールしたいアプリケーションの依存関係も含めて一括でインストール/アンインストールできる便利コマンドです。

設定ファイル

/etc/apt/sources.list が設定ファイル。ここに記述したURLを元にインストール可能なアプリケーションを探すことができます。

例えばUbuntu10.04ではJavaがOpenJDKになっています。SunのJDKをインストールするには、以下のURLを追加する必要があります。

deb http://archive.canonical.com/ lucid partner

コマンド

更新する

ソースを追加したとき、ひさしぶりに使うときは必ず apt-get を更新します。これをしないと古いものを参照してしまうことになるので、忘れずにやらなければいけません。

# apt-get update
探す(例:アプリケーションサーバTomcat
# apt-cache search tomcat6
詳細をみる
# apt-cache show tomcat6
インストールする
# apt-get install tomcat6
インストールしたアプリケーションの一覧をみる
# dpkg -l
インストールしたアプリケーションの設定ファイル等の場所を調べる
# dpkg -L tomcat6

aptitudeとの違い

aptitude とは apt-getやapt-cacheのフロントエンドです。aptitude の優位性はアンインストールの際にも、依存関係を考慮して削除してくれる autoremove にありました。

# aptitude autoremove tomcat6

ですが、比較的新しいバージョンの apt-getコマンドには autoremove が追加されているため、aptitudeを使う理由はもうありません。好みです。

# apt-get autoremove tomcat6
アンインストール

設定ファイルもすべて削除したい場合は必ず --purge オプションをつけます。

# apt-get --purge autoremove tomcat6

よかったらMac版もどうぞ

Macにも MacPorts というパッケージ管理システムがあります。以前にわりと詳細なエントリーを書いているのでよかったらどうぞ。

具体的なMacPortsの説明 - Liquidfuncの日記

Linuxを勉強するためのおすすめ書籍

これは資格試験用の教科書なのですが、未経験じゃないなら転職には困らないはずなので資格自体を取る必要はありません。
注目すべきは内容で、この本ほどLinuxについてわかりやすく解説してくれる書籍は他にありません。Linux初学者は絶対買った方がいいです。捗ります。

Linux教科書 LPICレベル1 第4版 (CD-ROM付)

Linux教科書 LPICレベル1 第4版 (CD-ROM付)


また、サーバ管理者にはぜひレベル2の本も強くオススメします。いまソーシャルアプリのサーバ構築を任されているのですが、両方とも現場でとても役にたっています。

Linux教科書 LPICレベル2 第3版 (CD-ROM付)

Linux教科書 LPICレベル2 第3版 (CD-ROM付)

CPUのコアの数え方

liquidfunc2011-05-02

並べて書いてみた

シングルコア、デュアルコア、トリプルコア、クアッドコア、ヘキサコア、オクタルコア(オクタコア
Single-Core, Dual-Core, Triple-Core, Quad-Core, Hexa-Core, Octal-Core*1(Octa-Core*2

リスト記法で書いてみた

  1. Single
  2. Dual
  3. Triple
  4. Quad
  5. -
  6. Hexa
  7. -
  8. Octal (Octa)

表組み記法で書いてみた

コア数 英語 カタカナ
1 single-core シングルコア
2 dual-core デュアルコア
3 triple-core トリプルコア
4 quad-core クアッドコア
6 hexa-core ヘキサコア
8 octal-core オクタルコア

*1:Intelの呼び方

*2:AMDの呼び方

安くてかっこいいミニベロ

春ということで自転車ほしいですよね!買うならミニベロがいいなーっとずっと思っていて、あれこれ探していました。

最近だと、楽天の広告リンクにもよく出てくるBrunoのコレ。カッコいいですよね!


でも6万円はちょっと高い・・・。この値段ならいっそのこともっといいの買ってみようかと検討しました。僕は都内に住んでいるので、道には段差が多くサスペンション付きならいいな!と常々思っていたんです。サスペンションあるとおしりが痛くないんですよ。段差越える毎におしりを浮かせる必要がありません。そこでルイガノのこれ。

2010【ルイガノ】(JJEDI 8) 折りたたみ自転車 ブラック

2010【ルイガノ】(JJEDI 8) 折りたたみ自転車 ブラック


でも13万はちょっと・・・。


ということで、結局これを買うことに!!16,800円なのにシンプルでカッコいいデザインだったから、これでいいじゃん!と購入しました。

メーカーHP http://www.doppelganger.jp/product/231/


DOPPELGANGERはたくさんラインナップあるんですが、じっくり見てみると厨二っぽい余計なメッセージをでかでかと書いてあったりして恥ずかしくなるんですよね。でもこれはシンプルで良いデザインだと思いました。
オトク!

JavaでタイムゾーンをPSTにするスニペット

Javaで時刻をPST(太平洋標準時)に直すスニペットです。
System.currentTimeMills()で現在時刻を取得して、それをGMTやPSTに直したいときってありますよね。たぶん。
例えば、Amazon EC2使って海外のユーザをターゲットにFacebookアプリを使うときとかに必要になるんじゃないでしょうか。

サンプルコード

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class Sample {
    
     // PSTに変換
     public static long toPST(long time) {
          TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
          long offset = tz.getOffset(time);
          long pstTime = time + offset;
          return pstTime;
    }
    
     // テストコード
     public static void main(String[] args) {
          long time = System.currentTimeMillis(); //現在時刻
          long pstTime = toPST(time);
         
          SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
          String date = sdf.format(new Date(time));
          String pstDate = sdf.format(new Date(pstTime));
          System.out.printf("%s ←日本の環境で実行してるのでデフォルトはJST%n", date);
          System.out.printf("%s ←PSTなので -8h%n", pstDate);
     }
    
}

実行結果

2011/02/15 20:18:44 ←日本の環境で実行してるのでデフォルトはJST
2011/02/15 12:18:44 ←PSTなので -8h

解説

JDK1.4から追加された getOffset(long time)が肝ですね。
「offset」は英語で「差し引き計算する」という意味だってIT用語辞典に書いてました。
引数に 0L を渡してもそうですし、多くの場合 -8時間分のミリ秒が返ると思います。じゃあなんのための引数かというと、夏時間が実施されている場合に調節してくれるそうです。

ワンライナー

上は読みやすいように4行のメソッドにしてますけど、こうすればスッキリですね。

public static long toPST(long time) {
    return time + TimeZone.getTimeZone("America/Los_Angeles").getOffset(time);
}

DotA系とは

liquidfunc2011-02-15

DotA は Defense of the Ancients の略称で Warcraft3 のカスタムゲームから生まれたゲームです。たくさんの派生があり、総称して "DotA系" と呼ばれています。
Blizzard が2002年7月にリリースした Warcraft3 は、RTSリアルタイムストラテジー)というジャンルのゲームで、World Editorという付属のソフトがあり、誰でもゲームを作ることが可能です。これはカスタムゲームと呼ばれ、Battle.net(Blizzardのオンラインゲーム・ネットワークのこと)上でオンライン対戦までできてしまいます。
ちなみにBlizzardは世界一課金ユーザの多いMMORPGWorld of Warcraft でも有名ですね。

だいたい共通の仕様

※派生ゲームの多さゆえに例外もたくさんあります

  • 2陣営に分かれて対戦
  • 豊富な選択可能キャラクター
  • 敵陣地の一番奥にある建物を壊すと勝利
  • 敵陣地までのルートが複数あり、一定時間毎に湧くそれぞれの陣営のNPCが各ルートを一直線に進攻
  • 中継地点には遠距離攻撃の塔が配置されており、一筋縄では壊せない
  • 敵陣営のNPCとプレイヤーを倒すことで、経験値とゴールドを取得
  • レベルアップでスキルを覚え、スキルレベルを上げることができる
  • 装備を購入して能力アップ

特徴

  • 1プレイ30分くらいの気楽なオンライン対戦
  • キャラクターが超豊富
  • ビルド次第で育て方は無限大
  • 仲間と大暴れする爽快感は中毒性高し

奥深いゲーム設計

立ち回り

どんなに強いと言われるヒーローがいても、プレイヤーが適切な操作をできなければ活躍できません。特に敵プレイヤーに殺されることはゴールドを与えることになるため、高確率でチームメンバーに Noob と罵られることになります。
さらに死んだ場合は復活までに数十秒かかるため、その間、経験地稼ぎもゴールド稼ぎもできず、差を広げられてしまいます。死なずに、且つ積極的に攻めるという相反する要素を極めた者だけが強者となりえます。

キルビル

プレイヤーのレベルが上がるごとに、4つあるスキルの中から、どのスキルレベルを上げるか選択します。均等に割り振ることもできますし、特化していくこともできます。
絶対的なスキルの振り方は存在せず、自分のプレイスタイルや敵チームの構成に合わせて柔軟に選択していく必要があります。

アイテムビルド

例えば物理攻撃タイプのヒーローであれば、攻撃速度を上げることで効率よく DPS をあげることができますし、魔法攻撃タイプのヒーローであれば魔法力UPのアイテムや、マナの自然回復力UPのアイテムを買うことで永久機関にしたりできます。Tankタイプのヒーローであればヘルスや防御力UPのアイテムを装備することで、チームの盾として乱戦時の要として重宝されます。
アイテムの影響は非常に大きく、アイテムビルド次第で同じキャラクターでもまったく異なる性質・強さへと変化します。
ゴールドはNPCを倒すか、敵プレイヤーを倒すことが主な収入源となるため、消極的なプレイをしていると敵との格差が広がってしまいます。

まとめ

要するにPvPの爽快感と、優れた戦術を取るために必要なビルドを考察する奥深さがあり、何度やっても飽きないゲーム設計になっています。

最新作

同ゲームのクリエイター達は独立したゲームとして、League of Legends(http://www.leagueoflegends.com/)を2010年5月にリリースしました。集大成と言えます。
日本人プレイヤーもわりと多く、2chを中心に活発な情報交換が行われています。日本語Wiki(http://loljp.net/wiki/)が充実しているのもそのためです。
League of Legends は基本プレイ無料のゲームですが、課金アイテムはスキン(見た目の変更)や選択可能なキャラクターのアンロックがメインで、ゲームバランスに影響を与えるものではありません。
この辺がコアユーザにはうれしいですね。

Scala2.8 + Lift2.2 + SBT0.7.4 で構築

これを見ながらやってみた。
http://www.assembla.com/wiki/show/liftweb/USING_sbt

事前準備

  • JDKをインストール
  • Scalaをインストール
  • Mavenをインストール
  • SBTをインストール

まずはMavenで基本構造を作成

適当なディレクトリ作成

$mkdir work
$cd work

Mavenアーキタイプを指定してLiftをダウンロード。赤字部分は任意の文字列を入力。

$mvn archetype:generate -U \
> -DarchetypeGroupId=net.liftweb \
> -DarchetypeArtifactId=lift-archetype-basic_2.8.0 \
> -DarchetypeVersion=2.2-SNAPSHOT \
> -DarchetypeRepository=http://scala-tools.org/repo-snapshots \
> -DremoteRepositories=http://scala-tools.org/repo-snapshots \
> -DgroupId=your.domain \
    
とすると、以下が出力されて構築完了。
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'archetype'.
[INFO] org.apache.maven.plugins: checking for updates from central
[INFO] org.codehaus.mojo: checking for updates from central
[INFO] artifact org.apache.maven.plugins:maven-archetype-plugin: checking for updates from central
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Default Project
[INFO]    task-segment: [archetype:generate] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] Preparing archetype:generate
[INFO] No goals needed for project - skipping
[INFO] [archetype:generate {execution: default-cli}]
[INFO] Generating project in Interactive mode
[INFO] Archetype defined by properties
[INFO] snapshot net.liftweb:lift-archetype-basic_2.8.0:2.2-SNAPSHOT: checking for updates from lift-archetype-basic_2.8.0-repo
Downloading: http://scala-tools.org/repo-snapshots/net/liftweb/lift-archetype-basic_2.8.0/2.2-SNAPSHOT/lift-archetype-basic_2.8.0-2.2-SNAPSHOT.jar
15K downloaded  (lift-archetype-basic_2.8.0-2.2-SNAPSHOT.jar)
Downloading: http://scala-tools.org/repo-snapshots/net/liftweb/lift-archetype-basic_2.8.0/2.2-SNAPSHOT/lift-archetype-basic_2.8.0-2.2-SNAPSHOT.pom
2K downloaded  (lift-archetype-basic_2.8.0-2.2-SNAPSHOT.pom)
[INFO] Using property: groupId = your.domain
[INFO] Using property: artifactId = sample
Define value for property 'version': 1.0-SNAPSHOT: 
[INFO] Using property: package = your.domain
[INFO] Using property: liftVersion = 2.2-SNAPSHOT
[INFO] Using property: logBackend = logback
[INFO] Using property: scalaVersion = 2.8.0
Confirm properties configuration:
groupId: your.domain
artifactId: sample
version: 1.0-SNAPSHOT
package: your.domain
liftVersion: 2.2-SNAPSHOT
logBackend: logback
scalaVersion: 2.8.0
Y: y
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 21 seconds
[INFO] Finished at: Thu Dec 02 02:39:48 JST 2010
[INFO] Final Memory: 11M/20M
[INFO] ------------------------------------------------------------------------

SBTでプロジェクトを初期化する

作成されたディレクトリへ移動。
$cd sample
SBT実行。
$sbt
すると全自動で完了する。
Getting Scala 2.7.7 ...
retrieving :: org.scala-tools.sbt#boot-scala
confs: [default] 2 artifacts copied, 0 already retrieved (9911kB/422ms) Getting org.scala-tools.sbt sbt_2.7.7 0.7.4 ...
retrieving :: org.scala-tools.sbt#boot-app
confs: [default] 15 artifacts copied, 0 already retrieved (4096kB/322ms) [info] Recompiling project definition... [info] Source analysis: 1 new/modified, 0 indirectly invalidated, 0 removed. Getting Scala 2.8.0 ...
retrieving :: org.scala-tools.sbt#boot-scala
confs: [default] 2 artifacts copied, 0 already retrieved (14484kB/646ms) [info] Building project sample 1.0-SNAPSHOT against Scala 2.8.0 [info] using LiftProject with sbt 0.7.4 and Scala 2.7.7 >
%%% 書きかけ %%%

SBTでScala2.8系をつかう

デフォルトはScala2.7.7となっています。sbtの対話モードで設定可能。

> set build.scala.versions 2.8.1
> reload


こうすると scala-compiler-2.8.1.jar と scala-library-2.8.1.jar のダウンロードが始まり、環境が構築されるみたい。