OmniAICreator/Qiita-1.07M huggingface dataset:
Catalinaにzshをインストールする際のメモ

~~Catalinaの環境で構築してみました。~~

Catalinaでは、ディフォルトのシェルがzshになったそうです。
zshのインストールは不要に。。。間違ってました。

oh-my-zsh をインストールについては、再インストールする機会があったので、自分のblogで内容を更新しています。
新しい情報はそちらを参考にしてください。
※単にoh-my-zshをインストールする記事ですが。

[Catalinaにoh-my-zshをインストールする際のメモ \| SHISHIDO.DEV](https://shishido.dev/macos-oh-my-zsh-install/)

> Mojaveの環境で構築してみましたが大丈夫でした。
> 
> Yosemiteにzshを入れる際に、つまずいたところがあったのでメモ。
> おそらく、Marvericsでも同じだと思う。El Capitanでも大丈夫。

##zshのインストール
homebrewを使ってインストールする。

```
brew install zsh --ignore-dependencies
```

```brew install --without-etcdir zsh``` このオプションは無くなったみたい

```/usr/local/bin/zsh``` を実行すると下記内容でエラーが出力。

```
$ /usr/local/bin/zsh
dyld: Library not loaded: /usr/local/opt/pcre/lib/libpcre.1.dylib
  Referenced from: /usr/local/bin/zsh
  Reason: image not found
zsh: abort      /usr/local/bin/zsh
```

```brew install pcre``` を実行

再度実行で、下記エラー出力

```
dyld: Library not loaded: /usr/local/opt/ncurses/lib/libncursesw.6.dylib
  Referenced from: /usr/local/bin/zsh
  Reason: image not found
zsh: abort      /usr/local/bin/zsh
```

```brew install ncurses``` を実行


`/etc/shells`を編集

```
/usr/local/bin/zsh
```

を追記し、ディフォルトのシェルを変更する。

```
chsh -s /usr/local/bin/zsh
```

ターミナルを再起動して完了。

`~/.zshrc`を編集。ファイルがなければ作成。

```
export PATH=/usr/local/bin:$PATH
```

を記載し、ターミナル再起動。

##oh-my-zsh をインストール

[robbyrussell/oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh)に記載のある、Basic Installationでインストールする。

```
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
```

テーマは下記から選ぶ
[robbyrussell/oh-my-zsh Themes](https://github.com/robbyrussell/oh-my-zsh/wiki/Themes)

`.zshrc`の下記設定でテーマを変更。

```
ZSH_THEME="robbyrussell"
```

##zsh-completionsのインストール

```
brew install zsh-completions
```

`.zshrc`の`plugins`をお好みで変更


```
plugins=(git ruby osx bundler brew rails emoji-clock)
```

###設定

`.zshrc`の一番下に追記

```
fpath=(/usr/local/share/zsh-completions $fpath)
```

下記を実施

```
rm -f ~/.zcompdump; compinit
autoload -Uz compinit
compinit -u
```

これで補完が使える。

##参考サイト


* ~~[ヾ(oﾟωﾟo)ﾉﾞbashからzshに移行して2014年を迎えよう！[ログインシェル]](http://qiita.com/harapeko_wktk/items/47aee77e6e7f7800fa03)~~ 404になってました。。。

* [Mac OS X で zsh ＋ oh-my-zsh の環境を作って一通り設定するまで](http://qiita.com/udzura/items/0d08d71d809bfd8c5981)
* [Homebrew で作るモダンなフロントエンド開発環境 (Git + zsh + apache + MySQL + Ruby)](http://dev.classmethod.jp/etc/modern-dev-environment-by-homebrew/)
[docker][Mac]panamaxで簡単にdockerを使う


# 背景

http://knowledge.sakura.ad.jp/tech/2350/

さくらのナレッジで紹介されていたので触ってみた。



# 参考URL

http://panamax.io/documentation/
https://www.andrewmunsell.com/blog/getting-started-with-panamax


# 構成

![panamax.png](https://qiita-image-store.s3.amazonaws.com/0/17518/e25b534e-52aa-752f-6b9c-ec11c0fab655.png "panamax.png")



通常、Mac上でDockerを動かす場合
VirtualBox上でCore OSを動かして、そこにDockerをインストール（boo2docker）…という形になる。
（LXCというLinux仮想化技術を使っているため）


Panamaxは `WebベースのDocker管理ソフトウェア` で
インストールこそコマンドラインから行うものの、それ以降のVMの立ち上げ等は
webブラウザから行える。

MacOSXと Ubuntuでサポートされている。
（ただし、UbuntuでもVirtualBoxが必要。）
[ここ](https://github.com/CenturyLinkLabs/panamax-ui/wiki/Installing-Panamax) を見るとWindows & Cygwinでもできなくはなさそう。




# 試す

## 環境

[インフラエンジニアなMacセットアップ](http://qiita.com/imura81gt/items/860ac6196e571c17b7e1)

の状態。


## 準備


* VirtualBox
	* VirtualBox 4.3 or higher
* Vagrant
	* Vagrant 1.6 or higher

homebrewとか使ってインストール。


## panamax


インストール

```
brew install http://download.panamax.io/installer/brew/panamax.rb
```

初期化

```
panamax init
```

CoreOS VMをインストールしたり、プロビジョニングしたりしてくれる。
ぼちぼち時間が掛かる。

![panamax-init.png](https://qiita-image-store.s3.amazonaws.com/0/17518/47be8f22-2c7c-dc74-53b2-934e78cdedb0.png "panamax-init.png")




最後に

```
Please go to http://10.0.0.200:3000 to access panamax.
```

と表示される。

アクセスすると、管理画面が表示される。
この画面からDockerリポジトリを検索できる。

![Panamax-web.png](https://qiita-image-store.s3.amazonaws.com/0/17518/7db070e1-58ba-a6a5-9f76-69e50a2a8320.png "Panamax-web.png")





試しに drupal を検索。 `Drupal 7.28 with MySQL 5.5` の `Run Template` をクリックして起動する。

![Panamax-0001.png](https://qiita-image-store.s3.amazonaws.com/0/17518/bd3245ad-24ec-ed60-6a8f-848d900aa9bf.png "Panamax-0001.png")




クリック直後には `Starting App...` とボタンが変わり、しばらくすると画面遷移する。

![Panamax-0002.png](https://qiita-image-store.s3.amazonaws.com/0/17518/a143f68f-7720-b966-c9be-cc466087b319.png "Panamax-0002.png")




くるくると、起動中。

![Panamax-0003.png](https://qiita-image-store.s3.amazonaws.com/0/17518/f7aaad87-9348-ae0c-5f30-86c122745df1.png "Panamax-0003.png")


起動中のログも表示される。

![Panamax-0004.png](https://qiita-image-store.s3.amazonaws.com/0/17518/90188914-1ced-076b-2fbd-e2c4f93daead.png "Panamax-0004.png")



Web Tierの `Drupal_7.28` をクリックすると

![Panamax-0006.png](https://qiita-image-store.s3.amazonaws.com/0/17518/80aece1a-fdf1-baa8-0808-79b209e2776b.png "Panamax-0006.png")


色々設定が書かれている。
`Ports` に書かれているURLにアクセスすると

![Panamax-0007.png](https://qiita-image-store.s3.amazonaws.com/0/17518/ceb51ba6-4f2f-b6a6-ece2-8af372163a13.png "Panamax-0007.png")




Drupal にアクセスできる。


![Panamax-0008.png](https://qiita-image-store.s3.amazonaws.com/0/17518/e4b2fdc1-e7cd-688c-3871-3c63a79f4015.png "Panamax-0008.png")






削除も簡単



![Panamax-0009.png](https://qiita-image-store.s3.amazonaws.com/0/17518/6643b883-b231-3b5c-57b0-5ce063041141.png "Panamax-0009.png")



# 所感

* 社内のエンジニアが構築したプライベートな設定で起動できるとかなり使えそう
* Windows Cygwinでちゃんと動くとローカル開発環境として使えそう
* web管理画面でVMが操作できるのがいい。エンジニアじゃない人が簡単に試せる
	* ローカルBitnamiみたいな感じで良い
	* ローカルHerokuみたいな感じで良い
* ナウなソフトウェアの簡単な動作確認とかできそう
	* gitlabとか
	* Grafana + InfluxDB + Elasticsearch とか
* Vagrantが必要なあたりの本末転倒感はある
ARChon + chromeos-apk を使って Chrome 上で Android アプリを動作させるときに躓いた点

##初めに
chromeos-apk は Chrome OS の Google Chrome (canary) 上で Android アプリを動作させることができるものです。
さらにそれを Windows, Mac, Linux 等でも動作させることができるようにするランタイムが Archon です。

僕の場合、こちらのサイト（[http://androplus.org/Entry/237/](http://androplus.org/Entry/237/)）を参考にしながら導入しました。

作業は 64bit 版 WIndows8.1 で行いました。

##躓いた点と対処法

### 1.Windows に Cygwin がインストールできない
英語でエラーが出て原因はよくわかりませんでした…

仕方がないので Node.js のインストールには [Chocolatey Gallery](http://chocolatey.org/) を使用しました。

### 2.いろいろエラーが出た（？）
```
Failed to load APK
Failed to parse package name in the APK.
Unknown APK package.
```

これは Windows8 のせいでユーザー名に2バイト文字が使用されていた（情弱）のと、
apk のファイル名が、パッケージ名.apk になっていなかったからでした。

apk のファイル名を パッケージ名.apk に変更、
ローカルディスク直下に置いてから指定することでエラーは出なくなりました。

###3.コンバートされた ～.android ディレクトリが見当たらない
本来 apk ファイルは chromeos-apk と同じディレクトリに置いて作業し、
コンバート（？）された ～.android ディレクトリも同じディレクトリ内に作られるはずなのですが、
先述の通り apk ファイルをローカルディスク直下に置いて作業したため、
そうならなかったようです。

普通にローカル検索をしたら "System32" ディレクトリ内に作られていました。　なんでや…

###4.『Archon There is no "message" element for key extName.』というエラーが出る
エラーメッセージの通りですね。

～.android ディレクトリの中の `_locales/messages.json`を開き、

```
"extName": {
    "description": "Extension name"
  }
```

この部分を

```
"extName": { 
"description": "Extension name", 
"message": "Extension name" 
}
```

このように書き換えることで無事読み込むことができるようになりました。

###最後に
どうしても Yo を Chrome で動かしたかった。
ちなみに未確認ですが、これちゃんと通知は来るんですかね？
通知が来ないと Yo 送るだけで意味がなくなってしまうのですが…
自作コマンド作成

<h1>シェルで自作コマンド作成</h1>

パスが通っているディレクトリににスクリプトが書かれたファイルを置くと、そのファイル名でコマンドが実行できる。以下そのための手順。

echo $PATH
&#035;出力結果に /home/ユーザー名/bin/ が含まれておりパスが通っていることを確認。
cd
mkdir bin
cd bin
vim newcommand

（newcommandの中身）
<pre>
&#035;!/bin/sh
echo 'newcommand実行'
</pre>

chmod +x newcommand #実行権限を与える
which newcommand #newcommandがパス通っている場所(/home/ユーザー名/bin) にあることを確認
newcommand #実行

・$PATHの左に書かれているディレクトリのコマンドが優先して実行される
・パスを通すディレクトリを編集したいときは.bash_profileで設定
Lubuntu/LXDEのLXTerminalをlogin-shellとしてメニューから起動する

LXTerminal から Ruby/rvm を使いたいとき、rvm が login-shell として動作することを求めるのでそうなるように指定します。ついでにウィンドウサイズを 80x40 にします。

# メニューの編集の準備
上記の為に MainMenu の LXTerminal の起動オプションを編集したいのですが、面倒なのでエディタを入れます。

* [LXMenuEditor](http://lxmed.sourceforge.net/index.html) を入れる

1. java runtimeをインストール。
1. http://lxmed.sourceforge.net/download.html からダウンロードしてインストール。

```bash
$ sudo apt-get install default-jre
$ tar xf lxmed-20120515.tar.gz        # ダウンロードしたファイル
$ ( cd lxmed; sudo sh ./install.sh )
```

これで MainMenu - Preferences - MainMenuEditor が使えるようになります。


# LXTerminal の起動オプションの変更

1. MainMenuEditor を起動して Accessories - LXTerminal の Property を開く。
2. Commandの項目を ```lxterminal``` から ```lxterminal --geometry=80x40 -e "bash -il"``` に変更。

この後に MainMenu から ```Add to desktop``` したり ```Application Launch Bar Settings``` で LXTerminal を追加すると、そこからは login-shell/80x40 で起動します。
オリジナルのボードゲームをルールからAIまで作る【概要編】


#はじめに
古くはチェスの世界チャンピオンに勝利したディープブルー、最近では将棋のプロ棋士とソフトが戦う電王戦...
ボードゲームはコンピュータの進化を図るひとつの指標となっています。

それこそ将棋の電王戦といえばNHKでも特集され今話題の分野。
最強の将棋ソフト、自分でも作ってみたいですよね。


しかしチェスや将棋の世界で1番になるのは苦難の道です。
天才たちが99%の努力と101%のひらめきで200%のパワーをぶつけ合う世界。
素人が戦いに挑んでも現実の厳しさをハムスターから教わることになるでしょう。
しかし発想を変えれば簡単に世界一になれる方法があります。

#### 競技人口1人のボードゲームを自ら創り、その中で世界一を目指す。

これ。
究極のブルーオーシャン戦略。

という訳で、

* オリジナルのボードゲームを考案する。
* 一人用として遊べるゲームとして実装する。

この２つのテーマで解説していきたいと思います。

#できあがりの品
できあがりの品がこれです。
こういうの作ります。

Colamone
http://xiidec.appspot.com/colamone/colamone.html

[![ColamoneSS.png](https://qiita-image-store.s3.amazonaws.com/0/33890/fc24026c-42f2-62fc-afea-9fb8d9a9afcf.png)](http://xiidec.appspot.com/colamone/colamone.html)

まぁこれは一例で、作り方さえ分かればあとはアイデア次第で色んなものが作れるはずです。

#必要な知識
ゲームの考案は自分にもできそう！
でもゲームの開発は難しそう！

実はそうでもないんです。

####対象読者

* Javascript/HTMLが読める人
* Javascript/HTMLが読めないけど何となく言いたいことは分かる人

この記事ではJavascriptを使います。いわゆるHTML5アプリってやつですね。
サーバーサイドは使いません。ブラウザ側でゴリゴリ動かします。

####開発規模

* ゲームのルールにもよるが筆者の開発したゲーム場合、全部合わせて1500行くらい。

自分の場合は開発に取り掛かってから3日くらいで雑魚AIと遊べるくらいまで作れました。
そこからの改良は何ヶ月かけても終わりが見えませんが、
たった1500行で、コンピュータと対戦できるボードゲームが取りあえずは作れます。

####やらないこと
以下のことはこの記事の中では、やりません。きっと他の人が教えてくれるはず。

* より高度なAIの開発
* 棋譜から自動学習するプログラムの開発
* ゲームを快適に遊ぶための機能の充実

#概略
具体的にどうすればボードゲームが作れるのか、概要を記します。
詳しい内容は次回以降の記事で解説していきますが、
概略だけ見れば「これくらいなら自分にもできる」と想像しやすいのではないでしょうか。


#### 1. オリジナルのボードゲームのルールを考案する。

ここ、重要です。
この記事で扱うのはチェスや将棋のような2人対戦型ボードゲームなのですが、
ゲームのルールによって難易度が全然違います。
御存知の通りオセロよりチェス、チェスより将棋、将棋より囲碁の方が
コンピュータにとって難易度の高いゲームとなります。
ここは志低く「コンピュータに有利なルール」にしてしまいましょう。
そうすれば自ずと歯ごたえのあるAIが出来上がります。

#### 2. 1人プレイできるゲームを作る。

* 2.1 UIを作る。
    まずUIを作ります。
    盤を表示して、コマを表示する・・・ルールにそって。
    ここまで出来上がれば取り敢えず１人遊びは出来ますね。でも寂しいですね。

* AIを作る。
    ボードゲームのAIを作ります。
    AI...人工知能...そう聞くととても難しそうですが、
    ボードゲームのAIに必要なのは

    * 探索部を作る。
    * 評価部を作る。

    実はたったこれだけです。
    極めようとすれば無限に奥の深い世界ですが、入り口の敷居は思いのほか低いです。

#Link
★★次の記事はこちら★★

オリジナルのボードゲームをルールからAIまで作る【ルール編】
http://qiita.com/kurehajime/items/44a83211c60eabc305e2

.

できあがりの品として紹介したColamoneのソースや開発記録はこちら。

Colamone -Github
https://github.com/kurehajime/colamone_js
Colamone開発ブログ
http://chmodarwx.hatenablog.com

ニコニコ自作フェスにも応募してます。。。

【WEBボードゲーム】Colamone(コラモネ)【ニコニコ自作ゲームフェス4】
http://www.nicovideo.jp/watch/sm24616525
Rails で serialized Hash なカラムを利用する時あれこれ

## 前提となるカラムサンプル

関連テーブルにしろよというのは置いておいて、以下のようなサンプルを考えます。

```rb
class User < ActiveRecord::Base
  serialize :usable_features, Hash # 利用可能な機能みたいなイメージ
end
```

例えば `{analytics: 'active_users', ip_address_control: true}` のような感じで、複数の機能に関する設定を持つような感じ。`analytics` に関してはいろんな値を持てるような。

## migration でのデフォルト値指定

参考: [Rails serialization with default value and new objects - stackoverflow](http://stackoverflow.com/questions/11530900/rails-serialization-with-default-value-and-new-objects)

参考のまんまですが、default に Hash を私 `#to_yaml` します。serialized Hash した場合には Yaml 形式で保存されるので、そのままと言えばそのままですね。

```rb
add_column :user, :usable_features, :text, default: {analytics: 'active_users'}.to_yaml
```

## API としてモデル更新を受ける場合

strong_parameters の設定に一曲あります。ネストしたモデルの更新に近い感じです。

```rb
# Hash の key となるものを並べる
params.require(:user).permit(usable_features: ['analytics', 'ip_address_control'])
```

## form からのモデル更新を受ける場合

参考: [How to edit Rails serialized hashes in a form? - stackoverflow](http://stackoverflow.com/questions/16690193/how-to-edit-rails-serialized-hashes-in-a-form)

参考サイトにはいくつかの手法が提案されているが、Hash の key 分のアクセサメソッドを定義するのが分かりやすい気がします。

```rb
class User < ActiveRecord::Base
  def analytics_usable_feature
    usable_features[:analytics]
  end

  def analytics_usable_feature=(value)
    if value.present?
      usable_features[:analytics] = value
    else
      usable_features.delete(:analytics)
    end
  end

  # 他の key の分も作る
end
```

上記は一例なので、`method_missing` を使ったり、`define_method` を使ったりして key 分のメソッド生成をもう少しスッキリ書けるようにしてもいいかもしれないです。以下のようにしているケースもありました。

http://stackoverflow.com/questions/1002963/how-to-edit-a-rails-serialized-field-in-a-form

各 Hash の key でアクセサを作っておけば `view` の方は普通の form の書き方ができます。

```haml
f.radio_button :analytics_usable_feature, 'active_users'
f.label :analytics_usable_feature, 'active_users', value: 'active_users'
```

> strong_parameters も追加する必要がありますね。

## factory_girl の設定

参考: [Add a Serialized Hash Attribute to a Factory_Girl Definition - RUBY COLORED GLASSES](http://www.rubycoloredglasses.com/2012/06/add-a-serialized-hash-attribute-to-a-factory_girl-definition/)

lazy attributes で指定します。または参考にあるように、単一の値が引数になるように書き換えます。

```rb
factory :user do
  usable_features { {analytics: 'active_users'} }
end
```
webpackでbower使って外部ライブラリの依存解決する

## やりたいこと

npmよりbowerのほうがクライアントパッケージは多いので、そっちから引っ張りたい。有名な奴はあるけどjqueryプラグインとかは全然足りない。

具体的には、

```
bower install jquery-textcomplete --save
```

とかして

```
require('text-complete')
```

したい

## 解決方法

bower_components以下のディレクトリもrequire pathにいれて、resolverプラグインで解決するようにする。

というかこの記事でやってることは、基本的には [usage with bower](http://webpack.github.io/docs/usage-with-bower.html "usage with bower")のまんまなんだけど…


## 実例

```javascript
var webpack = require('webpack');
var path = require('path');

module.exports = {
  output: {
    filename: 'app.js'
  },
  resolve: {
    root: [path.join(__dirname, "bower_components")],
    extensions: ["", ".js"]
  },
  plugins: [
    new webpack.ResolverPlugin(
      new webpack.ResolverPlugin.DirectoryDescriptionFilePlugin("bower.json", ["main"])
    )
  ]
}
```


これで bower install jquery したやつが

```
var $ = require('jquery')
```

できる

## 問題

bowerパッケージ、基本的にはbower.jsonのmain属性で指定されたファイルをrequireしようとするんだけど、bower.jsonの定義上、必須要素ではないので、結構な数のライブラリがそのままrequireできない問題がある。

そういうときはrequire時に無理やりファイルパスをたどったりする。
具体的にはこんな感じになる。

```javascript
require('foo/dist/foo');
Foo.bar()
```

この問題を解決するために、browserifyやmain-bower-filesといったライブラリでは、overridesという属性を使ってユーザー側で定義を上書きする仕様を導入して対応してきたんだけど、webpackのこの方法ではoverridesを見てくれないのでファイル名を解決できない。

[Overrides · Issue #585 · bower/bower](https://github.com/bower/bower/issues/585 "Overrides · Issue #585 · bower/bower")

overridesはこんな風に書く。

```
  "overrides": {
    "backbone": {
      "dependencies": {
        "lodash": "*"
      },
      "main": "backbone.js"
    }
  }
```


とりあえずwebpackにIssue立てておいた。
[Support 'overrides' option for bower.json · Issue #552 · webpack/webpack](https://github.com/webpack/webpack/issues/552 "Support 'overrides' option for bower.json · Issue #552 · webpack/webpack")

とはいえ、webpackはrequire先のファイルを自由に掘れるので、あんまり関係ない気がする。


あと中途半端にrequire.js用コードや、window変数やglobal変数みてるやつがcommon.js環境下で動かないことが多々あった。具体的に言うとraphael.jsとraven.jsが動かなかった。ワークアラウンドとして無理やりcommonjs通さずに評価したいんだが、やり方がわからんので、今は別途読み込んでる。誰かやり方わかったら教えてほしい…
忘れがちなGitコマンドのチートシート


こういうのはtigでやるのが楽なんですけど覚えておいて損はないですね。




# 基本操作

#### （WIPなプルリクのために）空コミットする

```
$ git commit -m '空コミット' --allow-empty
```


#### ステージングの変更と直近のコミット内容を比較する

```
$ git diff --cached
```

#### Gitでの追跡をやめる（ステージングエリアから削除する）

```
$ git rm --cached <ファイル名>
```

#### 特定のコミットだけを取ってきて適用する

```
# コミット
$ git cherry-pick <コミット>

# コミット範囲指定
$ git cherry-pick <開始コミット>..<終了コミット>
```


# 作業やり直し

#### 直前のコミットコメントを変更する

```
$ git commit -m "直前のコミット"
$ git commit --amend 
```

#### 直前のコミットを取消し

```
# 直前のコミットのみを元に戻す
$ git reset --soft HEAD~

# 直前のコミットとインデックスを元に戻す
$ git reset HEAD~

# 直前のコミットとインデックスと作業ファイルを元に戻す
$ git reset --hard HEAD~
```


#### マージの取り消し

```
$ git reset --hard ORIG_HEAD
```

#### やらかしたときに直前に戻る

```
# 戻りたいコミットをしらべる
$ git reflog 

# 調べたコミットに戻る
$ git reset --hard <調べたコミット>
```


#### 複数のコミットをまとめる

```
# 例) git rebase -i HEAD~~ 
$ git rebase -i <コミット>
```

rebase内で使えるコマンド

|コマンド|説明|
|--------|--------|
|p, pick|コミットをそのまま採用する|
|r, reword|コミットを採用するが、メッセージのみ書き換える|
|e, edit|コミットを採用するが、修正のために立ち止まる|
|s, squash|コミットを採用するが、前のコミットと合体させる|
|f, fixup|squashと同様だが、コミットログメッセージは捨てる|
|x, exec|シェルを使ってコマンドを実行する|

```
# 修正を適用する
$ git rebase --continue
```


#### 特定のコミットを打ち消す

```
# 打ち消しコミットが発生する（元のコミットはログとしては残る）
$ git revert <コミット>
```

#### マージコミットを打ち消す

```
# リリース後になにかあって切り戻す時などに利用
$ git revert -m 1 <コミット>
```


# ブランチの管理

#### ブランチを削除する

```
$ git branch -d <ブランチ名>
```

#### マージ済みまたは未マージのブランチ一覧を表示する

```
# マージ済み
$ git branch --merged

# 未マージ
$ git branch --no-merged
```

#### リモートブランチをローカルにチェックアウトする

```
$ git checkout -b <ローカルブランチ名> origin/<リモートブランチ名>

# または以下
$ git checkout -t origin/<リモートブランチ名>

# リモートにあってローカルにない場合は以下でもOK
$ git checkout <リモートブランチ名>
```

#### ローカルブランチをリモートブランチにプッシュする

```
$ git push origin <ローカルブランチ名>:<リモートブランチ名前>
```

#### ブランチ名を変更する

```
$ git branch -m <変更前ブランチ名> <変更後ブランチ名>
```

#### リモートブランチを削除する

```
$ git push origin :<リモートブランチ名>
```

#### ブランチ間の差分を比較する

```
$ git diff <ブランチ１>..<ブランチ2>
```

#### フェッチした内容をマージする

```
$ git fetch
$ git merge FETCH_HEAD
```




# 履歴の閲覧

#### 単語単位で差分を比較する

```
$ git log -U1 --word-diff
```

#### コミットを１行で出力する

```
$ git log --pretty=oneline
```

#### コミットごとに変更したファイル名を表示する

```
$ git log --pretty=oneline --name-only
```

#### コミットログを整形して表示する

```
$ git log --pretty=format:"<フォーマット>"
```

フォーマットに指定できるオプションは以下のとおり。

|オプション|内容|
|--------|--------|
|%H|	コミットのハッシュ|
|%h|	コミットのハッシュ (短縮版)|
|%T|	ツリーのハッシュ|
|%t|	ツリーのハッシュ (短縮版)|
|%P|	親のハッシュ|
|%p|	親のハッシュ (短縮版)|
|%an|	Author の名前|
|%ae|	Author のメールアドレス|
|%ad|	Author の日付 (--date= オプションに従った形式)|
|%ar|	Author の相対日付|
|%cn|	Committer の名前|
|%ce|	Committer のメールアドレス|
|%cd|	Committer の日付|
|%cr|	Committer の相対日付|
|%s|	件名|





# 作業内容を退避する


#### 作業中のファイルを一時退避して別ブランチで作業する

```
$ git stash
$ git checkout <移動先ブランチ>
$ git checkout <元のブランチ>
$ git stash pop
```

#### 退避した内容から別ブランチを作成する

```
$ git stash branch <ブランチ名>
```


# デバッグ

#### 特定ファイルの特定行を変更した人を特定する

```
# -w でホワイトスペースを無視
$ git blame -w -L <行番号> <対象ファイル>
```
Safariで閉じたタブをたくさん開き直す


chromeやfirefoxでは
`cmd+T`で新規タブを開いて
`shift+cmd+T`で閉じたタブを開き直す（たくさん閉じても閉じた順に開き直すことができる）
のですが、
safari では
`shit+cmd+T`ではなく`cmd+Z`で閉じたタブを一つだけ開き直すだけでした。

不便を感じていたのですが、これを改善するSafari機能拡張をやっと見つけました。

[閉じたタブをしっかり復元できるSafari機能拡張『RecoverTabs』](http://veadardiary.blog29.fc2.com/blog-entry-5258.html)
で紹介されていました。

これを入れると、 `shift+cmd+T` で、間違って閉じてしまったタブを幾つでも開き直しができるようになります。

設定で無限開き直しもできるようです。

https://github.com/Antrikshy/RecoverTabs
にソースが公開されており、
https://s3-us-west-1.amazonaws.com/antrikshyprojects/RecoverTabs.safariextz
からダウンロードできます。
doxygenで生成したドキュメントをvimから検索して開く



Osaka.vim#3の進捗です。

目的
----
コードを書いている時にこそドキュメントを手早く参照したいもの。
doxygenは優秀なドキュメントジェネレータだが
該当するページに行くための検索機能が十分であるとは言い難い。
さらに言えばコードはvimで書いているのでvimから直接検索できればなお良い。
そこでunite.vimを使用してdoxygenのページを検索し、
そのままブラウザで開くためのプラグインを作成した。
[unite-doxygen](http://github.com/termoshtt/unite-doxygen)

基本設計
-------
Doxygen v1.8.3で追加された[外部検索用の機能](http://www.stack.nl/~dimitri/doxygen/manual/extsearch.html)を使用する。
Doxygenからドキュメントのデータが入った`searchdata.xml`を生成し、
XSLTで平文に変換してunite.vimのソースに取り込む。

使い方
------

0. Doxygenでパースできるドキュメントが書いてあるプロジェクトを用意します
0. [libxslt](http://xmlsoft.org/libxslt/)をインストール
1. `doxygen`コマンドで`searchdata.xml`を生成する。
  そのためには以下のオプションをDoxyfile内で有効化(=YES)する。
  これでOUTPUT_DIRECTORYで指定されているディレクトリに`searchdata.xml`ができる。
2. `.vimrc`にOUTPUT_DIRECTORYのフルパスを書く。
  ```vim
  let g:unite_doxygen_home = "/full/path/of/OUTPUT_DIRECTORY"
  ```

3. vim上で`:Unite doxygen`を実行する

#### 追記
- Xalanのかわりにlibxslt(xsltproc)を使用するように変更
widgetPerformUpdateWithCompletionHandler()の挙動

以下はiOS8.1で試した結果です。

NCWidgetProvidingを実装したViewController（以下WidgetViewController）は、Widgetの表示時に生成され、ユーザがWidgetを閉じると破棄される。
しかし、widgetPerformUpdateWithCompletionHandler()のcompletionHandlerを呼ぶ前にWidgetを閉じると、completionHandlerが呼ばれるまで破棄を待つ。約10秒待ってもcompletionHandlerが呼ばれない場合、そのままWidgetViewControllerを破棄する。
この状態になると、その後でcompletionHandlerを呼んでも、次回以降二度とwidgetPerformUpdateWithCompletionHandler()は呼ばれなくなる。
これを回避するためにいろいろ試した。

* selfをキャプチャして破棄を防いでみる

```
	func widgetPerformUpdateWithCompletionHandler(completionHandler: ((NCUpdateResult) -> Void)!) {
		NSLog("widgetPerformUpdateWithCompletionHandler")
		dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
			NSThread.sleepForTimeInterval(20)
			dispatch_async(dispatch_get_main_queue()) {
				self.finish(completionHandler)
			}
		}
	}
	
	func finish(completionHandler: ((NCUpdateResult) -> Void)!) {
		println("completionHandler")
		completionHandler(.NoData)
	}
```

これだとcompletionHandlerを呼んだ後にselfが破棄されるが、widgetPerformUpdateWithCompletionHandler()が呼ばれなくなる現象は直らない。
たぶんシステムがWidgetViewControllerへの参照を外した時点でcompletionHandlerが呼ばれていなければダメなのでは。

* viewWillDisappear()でcompletionHandlerを呼ぶ

```
	private var handler: ((NCUpdateResult) -> Void)?

	override func viewWillDisappear(animated: Bool) {
		super.viewWillDisappear(animated)
		
		if let block = handler {
			NSLog("viewWillDisappear completionHandler")
			block(.NoData)
			handler = nil
		}
	}

	func widgetPerformUpdateWithCompletionHandler(completionHandler: ((NCUpdateResult) -> Void)!) {
		NSLog("widgetPerformUpdateWithCompletionHandler")
		handler = completionHandler
		dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { [weak self] in
			NSThread.sleepForTimeInterval(20)
			dispatch_async(dispatch_get_main_queue()) {
				NSLog("completionHandler")
				if let block = self?.handler {
					NSLog("block")
					block(.NoData)
					self?.handler = nil
				}
			}
		}
	}
```

これだとWidgetを閉じたときにcompletionHandlerを呼ぶことができ、widgetPerformUpdateWithCompletionHandler()が呼ばれなくなることを回避できる。
実際はNSThread.sleepForTimeInterval()の部分に更新処理が入るのだが、viewWillDisappear()でキャンセルするのがよさそう。

* まとめ

widgetPerformUpdateWithCompletionHandler()のcompletionHandlerは、Widgetが非表示になってから約10秒以内に呼ぶ必要がある。そうしなければそれ以降widgetPerformUpdateWithCompletionHandler()は呼ばれなくなる。
この仕様はOSのアップデートで変わる可能性があるので、更新処理はviewWillAppear()でやったほうが無難かも。
JavaからGroovyのクラスを使用しているコードをGradleでコンパイルする

#問題
↓こんな構成のプロジェクトがあったとして、

```text:
|-build.gradle
`-src/main/
   |-java/sample
   |  `-JavaClass.java
   `-groovy/sample
      `-GroovyClass.groovy
```

```java:JavaClass.java
package sample;

public class JavaClass {
    
    public static void main(String[] args) {
        new GroovyClass().method();
    }
}
```

```groovy:GroovyClass.groovy
package sample

def class GroovyClass {
    def method() {
        println 'GroovyClass.method()'
    }
}
```

Java と Groovy で、それぞれクラスを定義して、 Java 側の実装が Groovy の実装を参照している、という構成。

これを Gradle でコンパイルするために ↓ のように build.gradle を記述したとする。

```groovy:build.gradle
apply plugin: 'groovy'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.3.0'
}
```

コンパイルすると、 ↓ のようになる。

```text:
> gradle classes
:compileJava
F:\tmp\gradle\groovy\src\main\java\sample\JavaClass.java:6: エラー: シンボルを見つけられません
        new GroovyClass().method();
            ^
  シンボル:   クラス GroovyClass
  場所: クラス JavaClass
エラー1個
:compileJava FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':compileJava'.
> Compilation failed; see the compiler error output for details.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 3.827 secs
```

Groovy のクラスが見つけられません、とエラーになる。

#解決策
[ググったら](http://forums.gradle.org/gradle/topics/how_to_compile_groovy_sources_mixed_with_java_sources) 、 ↓ のようにしないといけないらしい。

```groovy:build.gradle
apply plugin: 'groovy'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.3.0'
}

sourceSets.main.java.srcDirs = []
sourceSets.main.groovy.srcDirs += 'src/main/java'
```

Java 側のソースセットを消して、 Groovy 側に追加する。

```text:
> gradle classes
:compileJava UP-TO-DATE
:compileGroovy UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE

BUILD SUCCESSFUL

Total time: 3.423 secs
```

コンパイルできた。
Swift のString型でよく使うメソッドの覚え書き


##開発環境

PC: MacOS X 10.9.4
Xcode: Version 6.1


##空文字チェック isEmpty

空文字チェックには、`isEmpty`メソッドを使用する。戻り値は、`true`/`false`なので、`if`文で評価できる。

![スクリーンショット 2014-10-25 17.23.05.png](https://qiita-image-store.s3.amazonaws.com/0/3184/4ef5e06f-f325-c955-1aa8-68892f8cce23.png "スクリーンショット 2014-10-25 17.23.05.png")


###空文字の代入

![スクリーンショット 2014-10-25 17.23.25.png](https://qiita-image-store.s3.amazonaws.com/0/3184/407fcef9-93d8-4c3b-e260-098995d79531.png "スクリーンショット 2014-10-25 17.23.25.png")


###nilの代入の場合

ちなみ nilの代入は、そもそも許されていないので、コンパイルエラーとなる。

![スクリーンショット 2014-10-25 17.23.56.png](https://qiita-image-store.s3.amazonaws.com/0/3184/2b87e222-c45a-cf5b-850b-1254dc0a693d.png "スクリーンショット 2014-10-25 17.23.56.png")

そこで強引に`nil`をOKとする`Optional`型で宣言してみる。
ちなみに、`if`文の評価は、`nil`ではできないので、`str?.isEmpty == nil`とする。 

![スクリーンショット 2014-10-25 17.40.06.png](https://qiita-image-store.s3.amazonaws.com/0/3184/0505af10-0851-23fa-0b1b-e56cf6f601a8.png "スクリーンショット 2014-10-25 17.40.06.png")

この評価方法だと、当然、空文字は`nil`ではない。

![スクリーンショット 2014-10-25 17.39.45.png](https://qiita-image-store.s3.amazonaws.com/0/3184/50da61b9-35da-ecff-0567-93642acf3949.png "スクリーンショット 2014-10-25 17.39.45.png")

なかなか`Optional`型の挙動と使用方法が、感覚的に慣れてこない。


##文字列の結合

これは覚え書きする程でもなく・・・。`+`で文字列結合。

![スクリーンショット 2014-10-25 17.59.47.png](https://qiita-image-store.s3.amazonaws.com/0/3184/659dbf4d-67de-4405-7c82-090f67daae2c.png "スクリーンショット 2014-10-25 17.59.47.png")

`swift`での文字結合は `+` を利用するのが定番であるが、`NSString`の文字列関数が、まだまだ便利だという流れで、`NSString`を使用する場合もあるかもしれない。
その場合は、`Foundation`ライブラリをインポートして、下記の方法も可能である。

###`NSString`型に代入してメソッドを使用した場合

![スクリーンショット 2014-10-25 20.20.52.png](https://qiita-image-store.s3.amazonaws.com/0/3184/74dc93a5-f2e3-4e1f-1a59-33bcddd28c23.png "スクリーンショット 2014-10-25 20.20.52.png")

###キャストして`NSString`型のメソッドを使用した場合

![スクリーンショット 2014-10-25 20.21.09.png](https://qiita-image-store.s3.amazonaws.com/0/3184/3e886b0b-2c85-91d6-8684-95e33407aa69.png "スクリーンショット 2014-10-25 20.21.09.png")

##文字数の取得

やはり、これも`NSString`型にキャストして、`length`で取得するのが無難なようだ。

![スクリーンショット 2014-10-25 23.24.45.png](https://qiita-image-store.s3.amazonaws.com/0/3184/2c7a71ce-d030-529b-1a41-b324b1cb9bee.png "スクリーンショット 2014-10-25 23.24.45.png")

##文字列の取得

![スクリーンショット 2014-10-25 23.44.57.png](https://qiita-image-store.s3.amazonaws.com/0/3184/033a3865-a14d-1c4a-6890-7fc2d90d855c.png "スクリーンショット 2014-10-25 23.44.57.png")

##数値変換

文字列同士では、`+`を使用すると文字列連結するので、下記の例では、`"3" + "5" = "35"` となる。
これを数値型に変換することによって数値計算できる。`3 + 5 = 8`となる。


![スクリーンショット 2014-10-26 0.16.59.png](https://qiita-image-store.s3.amazonaws.com/0/3184/89170bc8-b792-1c50-6159-699d5ee9d5b6.png "スクリーンショット 2014-10-26 0.16.59.png")

ちなみに、数値文字でなく文字を入れると、コンパイル時エラーとなってくれる。

![スクリーンショット 2014-10-26 0.23.35.png](https://qiita-image-store.s3.amazonaws.com/0/3184/eb4c434d-9bce-75e9-6c00-5311ea54c070.png "スクリーンショット 2014-10-26 0.23.35.png")




`swift`の`String`型を利用するより、まだ`NSString`型のメソッドを利用した方が便利気がする。
正直言って、このまま`Objective-C`を覚えてしまいそうだ。

これからの`swift`に期待する。
とりあえず、ここまで。

*Lovely Swift!!!*
ionicで4inch retina指定でiOS Simulatorを立ち上げる

ionicからiOSシミュレーターを起動するとデフォルトだとiPhone 4sで立ち上がる。
デバイス指定して立ち上げるのは下記

```
$ ionic emulate ios --target="iPhone (Retina 4-inch)"
```

Cordova系なら同じとみた
勉強会レポート -第1回オーシャンビューAndroid/iOS勉強会inBizreach-

## 詳細
渋谷クロスタワー12階にあるおしゃれなスペースで開催。
[第1回オーシャンビューAndroid/iOS勉強会inBizreach]
(http://biz-ocean.connpass.com/event/9072/)

## Google I/O 2014 アプリに学ぶ Material Design の実装 + 質疑応 hydrakecat さん

黒川洋 氏
グノシーAndroidエンジニア、O'Reilly翻訳など
[本日の資料：Google I/O アプリに学ぶ
Material Design の実装]
(https://speakerdeck.com/hkurokawa/o-apurinixue-bumateriarudezainfalseshi-zhuang-2014-10-25)

### Material Design とは
哲学的な概念的なもの
- 紙・インクを模したもの（ユーザにとって馴染み深いもの）
- アニメーション
- グラフィックデザインの分かりやすさをつかおう！

### Anroidでどうやって Material Design を実現するか
ロリポップでどうやって実装するか
Google I/O 2014用アプリ（Googleのベストがつまったアプリ）

### Google I/O 2014用アプリのロリポップ的なところ
1. **マテリアルテーマ**（カラーパレットで簡単に色を指定することができる）。
ベーステーマは3種類。
ナビゲーションバー、ステータスバーの色も変更できる（ナビゲーションだけの透明は不可）。
1. **リストとカード**
1. **影とクリップ**
紙を置いたときの影を表現する。
Lでは各ビューのz軸方向の位置を指定できる。
影のつけかた
Viewの外形を指定できる（影のかたちを表現）
setClipToOutline（丸く切りとれる）
1. **画像**
android:tint（画像の着色ができる）
1. **アニメーション**
1.タッチ・フェードバック
2.出現エフェクト（円形上のアニメーションでViewを出現させることができる。タップしたときのアニメーションに使用）
3.アクテビティの遷移
4.ビューの状態遷移
5.画像の着色

1. **互換性**
マテリアルデザインは、Android4.4以下でも互換性あり。

グノシーでは、世間がマテリアルデザインに慣れたら実装予定かも。


## Android 4.4で追加されたステップカウンターを実装した話 + 質疑応答	uturist さん

ふうたりすと氏、企画系コーダー

### StepDetector、StepCounterについて
Android4.4から実装された機能
1. StepDetector（徒歩検出）
2. StepCounter（歩数カウンタ）

サポート端末：287

### 実装方法

[ぎゃっぷろさん資料参照]
(http://www.gaprot.jp/pickup/android-4-4/vol4/)

しらなかったジャンルなので感想。
同じ実装方法&歩数なのに端末によって検出された歩数が違う。
そうなのか！同じだと思ってた！

Activityが生きていれば画面に表示されなくても表示される。
そういうことか！なるほど。

センサーを使っていてもバッテリーの減りは気にならない。
バッテリー減るものかと思ってた！

### 実際に使われるもの（予定含む）
健康アプリ
旅アプリ
ゲームアプリ
レストランアプリ
ECアプリ　など

**ステップカウンターが普及すれば世の中が健康になるのでは！！**


## アプリ開発途中でのtest,deploy,destribution + 質疑応答 yoshimaa さん
松本佳記 氏

### デバック環境をどうしていますか？
1.標準エミュレータ(遅い・・・)
2.実機デバック（端末依存・・・）

### こんなのありました！
1.DeployGate
[DeployGateサイト]
(https://deploygate.com/?locale=ja)
USBケーブルがなくても検証できる。

2.Sumatium
[Sumatiumサイト]
(https://www.sumatium.com/)
まだBeta版。
Nativeアプリを複数機種で同時検証できる。


## 自作アプリをiOS 8対応した話 〜FastCheckin編〜 koogawa さん
小川航佑 さん。iOSエンジニア

### 位置情報取得方法の変更
・位置情報取得周りがいろいろ変更された
使用中のみ許可、常に許可と細分化
・UsageDescriptionが必須に
どのような目的で位置情報を使用するかの記載
・認証リクエストAPI追加
iOS7で使用するとクラッシュするので要注意。

### ウィジェット対応
ウィジェットとは。
iOS8から使用可能。
通知センターにウェジェットを置ける。
App Extensionのひとつ。
→Today Extension がウィジェットにあたる。

実装方法
xcodeで Today Extension を指定すると"HelloWorld"までできている。

注意点
キーボードが使えない
アラートビューがつかえない
高さに制限ある
使用メモリ量い注意（16MB以内？？）


## 10分でTwitterクライアントを作ってみますん + 質疑応答 mofneko さん

・・・という夢をみた。
すみません。
頑張って作れるような発表をします。
=ライブラリを使用することで可能になります。

### なぜライブラリを使うのか

作業を速く行える→依頼主が満足できる。

### デバックツール
[Genymotion]
(http://www.genymotion.com/)

### Android-Bootstrap
簡単に小洒落た見た目のボタンやテキストが作れる

### kwsk
[Font Awesome（ボタンなどの画像）]
(http://fortawesome.github.io/Font-Awesome/)
CircleThumbnail（円形アイコンの実装）
JsonPullParser
Volley（通信処理）
OrmLite
Butter Knife（アノテーションでコード量を減らす）
→これやりたい（私的メモ）

Jenkinsおじさんの画像を変更できます。


## 24カ国語i18n と自動化テスト + 質疑応答 kaiinui さん

会場にいない・・・。
あれ？？

事件発生。

以上、本日の勉強会でした。
enthumble キーカスタマイズ（ウインドウにフォーカスを当てる）


ポップアップウインドウが出てくると、元のウィンドウのフォーカスが外れてしまい、マウスの右クリックをしてフォーカスしなおさないといけないときがあります。

Win＋TABでフォーカスできるのですが、無変換＋Enetr で Win＋TABしてフォーカスできるようにしてみました。
また、無変換 ＋ ： で、マウス右クリックできるようにしてみました。

また、以下の様な設定も試しています。

U={PgDn}
I={PgUp}

G={Home}
;={End}
N： シート左 TABへ
.： シート右 TABへ


```lang:HJKL.iniの設定
[HowToUse]
Check=http://jp.enthumble.com
Name=enthumble version 3.0
[KEY]
Space={Enter}
Muhenkan={Esc}
Henkan={Esc}
Hiragana={}
F1={}
F2={}
F3={}
F4={}
F5={}
F6={}
F7={}
F8={}
F9={}
F10={Volume_Mute}
F11={Volume_Down}{Volume_Down}
F12={Volume_Up}{Volume_Up}
F23={}
F24={}
1={F1}
2={F2}
3={F3}
4={F4}
5={F5}
6={F6}
7={F7}
8={F8}
9={F9}
0={F10}
-={F11}
Hat={F12}
\={}
Q=^q
W=^w
E=^e
R=^r
T=^t
Y={ctrl down}{shift down}{PgUp}{ctrl up}{shift up}
    ; シート左 TABへ
U={PgDn}
I={PgUp}
O={ctrl down}{shift down}{PgDn}{ctrl up}{shift up}
    ; シート右 TABへ
P={up}
@={}
LB={}
A=^a
S=^s
D=^d
F={right}
G={Home}
H={left}
J={down}
K={up}
L={right}
Semicolon={End}
:= {RButton}
  ; マウス右クリック
RB={}
Z=^z
X=^x
C=^c
V=^v
B={left}
N={ctrl down}{shift down}{PgUp}{ctrl up}{shift up}
    ; シート左 TABへ
M={ctrl down}{shift down}{Tab}{ctrl up}{shift up}
  ;タブ切り替え可能なアプリケーションで前のタブに切り替える
,={ctrl down}{Tab}{ctrl up}
  ;タブ切り替え可能なアプリケーションで次のタブに切り替える
;.={ctrl down}{Tab}{ctrl up}
  ;タブ切り替え可能なアプリケーションで次のタブに切り替える
.={ctrl down}{shift down}{PgDn}{ctrl up}{shift up}
    ; シート右 TABへ
/={}
Backslash={}
Up={ASC 33194}
Down={ASC 33195}
Left={ASC 33193}
Right={ASC 33192}
LButton={ctrl down}{PgUp}{ctrl up}
MButton={MButton}
RButton={ctrl down}{PgDn}{ctrl up}
WheelUp={}
UWheeDown={}
PageUp={}
PageDown={}
Home={}
End={}
Delete={}
Bacspace={}
Enter={Lwin down}{Tab}{Lwin up}
  ;フォーカスを当てる
Escape={}
Hankaku={}
Tab={}
Capslock={}
Lwin={}
Rwin={}
Insert={}
```
oocss&smacss&bemでのcss改善まとめ



# **oocss**

参考

* <a href="https://app.codegrid.net/entry/oocss-1" target="_blank">知っておきたいHTMLテンプレート設計法 - OOCSSの基本</a>

ルール

* 場所に依存した指定方法をしない
* レゴのように考える

## スキン
装飾など。smacssでいうモジュールの部分。

## 構造
骨格。


# **smacss**
参考

* [SMACSSによるCSSの設計 ベースとレイアウト](https://app.codegrid.net/entry/smacss-1)

つくってるプロジェクトでは、oocssだけで十分で、smacssはガチで取り入れなくてもいい気がした。理由↓

* レイアウト>>使う機会が少ない。gridなどを使う機会があまりない。あるとしても、oocssでいう骨格を作るのと同等（な気がしている）。
* テーマルール>>使わなそう
* モジュール>>oocssのスキン的な考えで十分
* 状態>>これは普段からやっている気がする。

## ベース
要素そのもののデフォルトスタイル

## レイアウト
ページをエリアごとに分割

## モジュール
再利用可能なパーツ

## 状態（ステート）
レイアウトやモジュールの特定の状態を示す

## テーマ
サイトのルック＆フィールを定義


# **bem**

参考

* [SMACSS に BEM を取り入れよ](http://chroma.hatenablog.com/entry/2013/12/15/165511)

## Block 
アプリケーションの構成要素

## Element  
Block の構成要素

## Modifire 
元となる Block や Element で一部スタイルの変更に使うもの

## classの付け方

```
.block__element--modifire
```
Yosemiteってなんて読むの


#Yosemite本人に聞く
```$ say Yosemite```


ヨセマイト、みたいに言ってるけどすごい怪しい。自分のことなのにすごい怪しい。

#グーグル先生にお伺いを立てる
https://translate.google.co.jp/#en/ja/Yosemite

ジョッセミティ、みたいな感じでわりとそれっぽい。

#Wikipedia
OS X Yosemite (/joʊˈsɛmɨtiː/ yoh-sem-it-ee)と発音するらしいけど読めない。

本文に"Yosemite is named after the national park."とあって
http://en.wikipedia.org/wiki/Yosemite_National_Park
にリンクが貼ってあってその日本語版が

http://ja.wikipedia.org/wiki/ヨセミテ国立公園
なのでヨセミテでいいんですか。
/proc/meminfoのMemTotal

##/proc/meminfoのMemTotal
物理的なメモリ量と/proc/meminfoのMemTotalの値の差分については、Linuxカーネルのドキュメント「Documentation/filesystems/proc.txt」に記載がある。

```Documentation/filesystems/proc.txt
     MemTotal: Total usable ram (i.e. physical ram minus a few reserved
               bits and the kernel binary code)
```

上記にあるように、PCにくっつけたメモリ量すべてをあらわす値ではないことに注意する。
Vagrant memo

参考サイト
http://easyramble.com/install-vagrant-virtualbox-on-mac.html

| command         | topic          |
|-----------------|----------------|
| vagrant up      | VMを起動       |
| vagrant ssh     | ssh接続        |
| vagrant status  | 状態を確認      | 
| vagrant suspend | 一時停止        |
| vagrant reload  | リロード        |
| vagrant halt    | 仮想マシンを停止 |
| vagrant destroy | 仮想マシンを削除 |

# Vagrant のインストール

http://www.vagrantup.com/downloads.html

インストール後、バージョン確認

```
$ vagrant --version
Vagrant 1.6.3
```

## VMの構築ベースのBOXを追加

下記URLよりダウンロードする
http://www.vagrantbox.es/

CentOS 6.5
https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box

```
vagrant box add centos65 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
```

インストール終了後、確認

```
$ vagrant box list
centos65 (virtualbox, 0)
```

~/Vagrant/CentOS65 ディレクトリで作業します。

```
$ mkdir -p ~/Vagrant/CentOS65
$ cd ~/Vagrant/CentOS65
```

```
$ vagrant init centos65
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
$ ls
Vagrantfile
```

## vagrant ssh

下記でSSH接続ができる

```
$ cd ~/Vagrant/CentOS65
$ vagrant ssh
```

Vagrantユーザーはパスワード無しで sudo できる。
rootパスワードは「vagrant」

# Vagrantfile の設定

http://lab.raqda.com/vagrant/index.html

```
$ vi Vagrantfile
```

> config.vm.network "private_network", guest: 80, host: 8080

ポートフォワーディングの設定。
上記例の場合、80番ポートなのでゲストOSのウェブサーバーにアクセスできる。

> config.vm.network "private_network", ip: "192.168.33.10"

プライベートネットワークの設定。

> config.vm.synced_folder "/host/path", "/guest/path"

ゲストとホストでフォルダを共有させる。
MacPortsの人限定。apache, mysql, postgres,落ちてるっぽい時。


MySQLが落ちてるっぽい時。

あー

```bash
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/opt/local/var/run/mysql5/mysqld.sock' (2)
```



```bash
sudo touch /opt/local/var/run/mysql5/mysqld.sock
```


```bash
sudo /opt/local/share/mysql5/mysql/mysql.server start

Starting MySQL
.. SUCCESS!
```

apacheが落ちてるっぽい時。

```bash
sudo /opt/local/apache2/bin/apachectl start
```


postgresが落ちてるっぽい時。


```bash
sudo su postgres
/opt/local/lib/postgresql90/bin/postgres -D /opt/local/var/db/postgresql90/defaultdb
```

なんでもいいんだがなんで勝手に落ちるかね。
MacでGUI操作するシェルスクリプトを書こうとしてハマったこと

## 前提知識
- MacではOSX 10.1.2からOpen Scripting Architecture準拠のAppleScriptの実行をサポートしている
  - OSX 10.10 YosemiteからJavaScriptもサポートされた
- `/usr/bin/osascript`にAppleScriptを渡すとGUIの操作（GUIスクリプティング）をシェルスクリプトから行うことができる
  - ただし、10.8までは **システム環境設定 >> アクセシビリティ >>「補助装置にアクセスできるようにする」** をオンにする必要がある
  - 10.9からはセキュリティ管理の仕組みがかわり、 **システム環境設定 >> セキュリティとプライバシー >> プライバシー >> アクセシビリティ** で、GUIスクリプティングを実行するアプリケーションごとにアクセシビリティを有効にする必要がある

## ハマったこと

Yosemiteをクリーンインストールしたあとに走らせると、`xcode-select --install`を実行してそのウィザードのクリックも自動でやってくれる[rebuild](https://github.com/k0kubun/rebuild)というgemを作った。
めちゃくちゃハマって何時間も無駄にしたので、私がハマった点を共有したい。

### そもそも何かけばいいのかわからない

Automator.appでワークフローを作成し、「AppleScriptを実行」を追加して、そこに「記録」で作ったフローをドラッグアンドドロップすると任意の操作を再現するAppleScriptが作られる。
なお、Script Editor.appの記録機能ではFinderの操作くらいしか記録してくれない。

### *.scpt is not allowed assistive access. というエラーが出る
これはAppleScriptを実行するアプリケーションがアクセシビリティを有効にされてないと出る。
アクセシビリティを管理するデータは`/Library/Application Support/com.apple.TCC/TCC.db`というsqliteのDBのaccessというテーブルに入っている。

スキーマは、

```
0|service|TEXT|1||1
1|client|TEXT|1||2
2|client_type|INTEGER|1||0
3|allowed|INTEGER|1||0
4|prompt_count|INTEGER|1||0
5|csreq|BLOB|0||0
```

となっていて、例えばTerminal.appからAppleScriptを走らせたい場合は `service="kTCCServiceAccessibility", client="com.apple.Terminal", client_type=0, allowed=1`にする必要がある。
つまり、以下のようなコマンドをAppleScriptの実行前に仕込めば良い。

```bash
sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db \
  "INSERT OR REPLACE INTO access VALUES('kTCCServiceAccessibility','com.apple.Terminal',0,1,0,NULL);"
```

なお、clientにいれるアプリケーションのbundle identifierは`codesign -dv ***.app`とやれば見れる。

### An error of type -10810 has occurred. というエラーが出る

これは場合による。
私が遭遇したケースでは、`*.scpt`にshebangつけて`chmod +x`していたせいで動かなくなっていて、`chmod -x`で実行可能属性を外したら（明示的にosascriptに渡していたので実行属性いらなかった）、うまく走るようになった。
Mac OS X Yosemiteでエミュレータが動かない時の対処法


**詳細は以下のサイトを確認して下さい**
http://www.csell.net/2014/09/03/VTNX_Not_Enabled/

## 経緯
Mac OS X Yosemiteにアップデートしたので、早速Android開発しようとエミュレータを立ち上げようとしたら、立ち上がらない！

MavericksでIntel HAXMを入れていたので、Yosemite用にアップデートしたら、"HAXが有効になってないよ！"というエラーと共に立ち上がらなくなりました。。。

この解決方法を以下に記します。

## 注意事項
この解決方法は、あくまでも個人の責任において実施してください。
ちょっと特殊なコマンドを実行する必要があるようなので、、、あくまで自己責任でお願いします。

## 対応方法
まずは、VMXがあるか、Terminalで確認。

```Terminal
$ sysctl -a | grep machdep.cpu.features 
```

実行するとVMXがないことが確認できる。
以下は、既に対策済みなのでVMXが含まれている。

```
machdep.cpu.features: FPU VME DE PSE TSC MSR PAE MCE CX8 APIC SEP MTRR PGE MCA CMOV PAT PSE36 CLFSH DS ACPI MMX FXSR SSE SSE2 SS HTT TM PBE SSE3 PCLMULQDQ DTES64 MON DSCPL VMX EST TM2 SSSE3 FMA CX16 TPR PDCM SSE4.1 SSE4.2 x2APIC MOVBE POPCNT AES PCID XSAVE OSXSAVE SEGLIM64 TSCTMR AVX1.0 RDRAND F16C
```

確認できたら、kextstatコマンドで、intelが含まれているか確認する。

```Terminal
$ kextstat | grep intel
```

何も表示されないはず。

ということで、そこまで確認できたら、以下のコマンドを実行したらOK。
**注意！自己責任で実行してください！！！**

```Terminal
$ sudo nvram boot-args="kext-dev-mode=1"
```

あとは、Macの再起動を行い、Intel HAXMを再インストールすれば、エミュレータが立ち上がるようになる。

つまずいたらお試しあれ！
【メモ】バイナリを扱う

お仕事でバイナリ文字列をテキストファイルに貼り付けられて
渡されたので。。。 :fearful: 

```clj
(def hex (DatatypeConverter/printHexBinary bytes))
(String. (DatatypeConverter/parseHexBinary hex))
```

こんな感じで使える

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/39243/c4fc0d95-f390-2a1e-07dc-e5358aaa11a3.png)
Yosemiteに入ってるPHP5.5のコンパイルオプションを調べてみた

# バージョン確認
```
$ /usr/bin/php -v
PHP 5.5.14 (cli) (built: Sep  9 2014 19:09:25)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
```

# php -i でコンパイルオプションを見る

```
$ /usr/bin/php -i | grep ^Config | perl -pe 's/ +/\n/g' | sed -e s/\'//g
```

出力結果

```shell
--prefix=/usr
--mandir=/usr/share/man
--infodir=/usr/share/info
--disable-dependency-tracking
--sysconfdir=/private/etc
--with-apxs2=/usr/sbin/apxs
--enable-cli
--with-config-file-path=/etc
--with-config-file-scan-dir=/Library/Server/Web/Config/php
--with-libxml-dir=/usr
--with-openssl=/usr
--with-kerberos=/usr
--with-zlib=/usr
--enable-bcmath
--with-bz2=/usr
--enable-calendar
--disable-cgi
--with-curl=/usr
--enable-dba
--with-ndbm=/usr
--enable-exif
--enable-fpm
--enable-ftp
--with-png-dir=no
--with-gd
--with-jpeg-dir=/BinaryCache/apache_mod_php/apache_mod_php-93~55/Root/usr/local
--enable-gd-native-ttf
--with-icu-dir=/usr
--with-ldap=/usr
--with-ldap-sasl=/usr
--with-libedit=/usr
--enable-mbstring
--enable-mbregex
--with-mysql=mysqlnd
--with-mysqli=mysqlnd
--without-pear
--with-pear=no
--with-pdo-mysql=mysqlnd
--with-mysql-sock=/var/mysql/mysql.sock
--with-readline=/usr
--enable-shmop
--with-snmp=/usr
--enable-soap
--enable-sockets
--enable-sysvmsg
--enable-sysvsem
--enable-sysvshm
--with-tidy
--enable-wddx
--with-xmlrpc
--with-iconv-dir=/usr
--with-xsl=/usr
--enable-zend-multibyte
--enable-zip
--with-pcre-regex=/usr
```
Yosemiteでmbedにプログラムを書き込めない問題の対処法


YosemiteにアップデートしたMacにmbedを接続すると、読み取り専用ディスクと認識されプログラムの書き込みができない。

## mountコマンドでmbedを認識し直す

ターミナル.appで下のコマンドを実行してmbedをMacに認識し直させる。

```Terminal.app
sudo mount -u -w -o sync /Volumes/MBED
```

## ターミナル.appでhexファイルをコピーする

通常のような、ドラッグ&ドロップでhexファイルをmbedに書き込むことができないので、ターミナルでファイルをコピーする。

```Terminal.app
cp TARGET.hex /Volumes/MBED
```

## 参考サイト

[mbed From - Problems with mbed on OSX Yosemite](http://developer.mbed.org/forum/mbed/topic/5149/?page=1)
Elastic Beanstalk(Tomcat)でSpring-BootのProfileを指定する

# やりたいこと
* Elastic BeanstalkでSpring-BootのProfileを指定したい

# 前提条件
* AWS Elastic Beanstalk
* Predefined configuration：Tomcat

# 設定方法
1. AWS ConsoleでServicesからElastic Beanstalkを選択して、Elastic Beanstalk Applicationsを開く
1. 設定対象のEnvironmentをクリックする
1. Configurationをクリックする
1. Software Configurationの歯車をクリックする
1. "Environment Properties"で新しいPropertyを追加する
1. Property Nameに「spring.profiles.active」、Property ValueにProfile名を設定する
1. 「Save」をクリックして設定情報を反映させる
Elastic BeanstalkとRDSを接続する - Security Groupの設定

### 1. VPCでSecurity Groupを作成する

1. AWS ConsoleのServicesからVPCを選択して、VPC Dashboardを開く
1. Security Groupsをクリックして一覧を表示する
1. 「Create Security Group」を実行して、RDS用の新しいSecurity Groupを作成する
1. RDS用のSecurity Groupを作成したら、それを選択して、下部ペインに設定情報を表示させる
1. 「Inbound Rules」をクリックして「Edit」を実行する
1. Elastic Beansからの接続を許可する設定を追加する
1. Typeに接続許可するサービスを選択する(例えば、MySQL(3306))
1. SourceのフィールドをクリックするとGroup IDの一覧が候補として表示されるので、接続許可するElastic BeansのEnvironmentを選択する
1. 「Save」を実行して保存する

### 2. RDSでDB InstanceにSecurity Groupを設定する

1. AWS ConsoleのServicesからRDSを選択して、RDS Dashboardを開く
1. DB Instancesから対象のインスタンスを選択する
1. 「Instance Actions」から「Modify」を実行する
1. "Network & Security"で[1. VPCでSecurity Groupを作成する]で作成したSecurity Groupを選択する
1. 「Continue」⇒「Modify DB Instance」する
※新規にRDS Instanceを作成するときにSecurity Groupを選択しても良い

### 最初ちょっとはまったところ

RDSのDB InstanceからSecurity Group名リンクをクリックすると「EC2 Dashboard -> Security Groups」が表示され、Inbound Ruleを編集できるが、ここでは候補のSecurity Groupが一覧表示されず困った。
AWSのマニュアル読まずに適当やってたので、もしかしたらマニュアルにはちゃんと書いてあるのかもしれない。
【Capistrano3】実行タスク名をログに出力したい

### 方法
実行コマンドに`--trace`つけるだけだった・・・
capistrano2系だとlog_levelでTRACEとかいうのが指定できるらしいが3系では出来ない様子。

### 出力内容

```bash
** Invoke deploy:xxxxx (first_time)
** Execute deploy:xxxxx
```

のような感じを区切りに、タスクの実行状況が出力される。


### 例

```bash
cap development deploy:test_task_1 --trace # test_task_1のあとにtest_task_2が走るようなタスク
```

最初にバリデーション？がガーッと走っている。

```rb
** Invoke development (first_time)
** Execute development
** Invoke load:defaults (first_time)
** Execute load:defaults
** Invoke bundler:map_bins (first_time)
** Execute bundler:map_bins
** Invoke deploy:set_rails_env (first_time)
** Execute deploy:set_rails_env
** Invoke deploy:set_rails_env
** Invoke rbenv:validate (first_time)
** Execute rbenv:validate
DEBUG[53f4b596] Running /usr/bin/env [ ! -d ~/.rbenv/versions/2.0.0-p451 ] on 192.xxx.xx.xx
DEBUG[53f4b596] Command: [ ! -d ~/.rbenv/versions/2.0.0-p451 ]
DEBUG[53f4b596] Finished in 0.112 seconds with exit status 1 (failed).
** Invoke rbenv:map_bins (first_time)
** Execute rbenv:map_bins
** Invoke deploy:test_task_1 (first_time)
** Execute deploy:test_task_1
INFO[1361267d] Running /usr/bin/env echo abcdefg on 192.xxx.xx.xx
DEBUG[1361267d] Command: echo abcdefg
DEBUG[1361267d]   abcdefg
INFO[1361267d] Finished in 0.028 seconds with exit status 0 (successful).
** Invoke deploy:test_task_2 (first_time)
** Execute deploy:test_task_2
INFO[ff511f2f] Running /usr/bin/env echo hijklmn on 192.xxx.xx.xx
DEBUG[ff511f2f] Command: echo hijklmn
DEBUG[ff511f2f]   hijklmn
INFO[ff511f2f] Finished in 0.032 seconds with exit status 0 (successful).
```

### ファイル出力したい

この画面の出力のままファイルに出力してくれればいいのに、
普通に `>` だと、InvokeとExecuteのログが別プロセス？で出力してるらしく、
結局まとまって出力されてしまうので、意味がない！

#### 苦肉の策

```bash
script -q -t 0 log.txt cap development deploy:test_task_1 --trace
```

順番どおりにファイル出力されるようになった！

ただし、capistrano3が色付けしている形跡も一緒に出されてしまうので、非常に見難い。
解決策はまだ見つからない。つらい。
ownCloud on nginx

最近でもストックしてもらえるので需要がある様子。
公式ドキュメント(Ver9.2)のURLが変わってしまったのでリンク先を修正しました
(2016/09/27)
#環境
Mac Book (Early2008)
OS:Lubuntu　14.04
http://hogehoge.com/　でGitlabを運用中
https://hogehoge.com/　でownCloudを使いたい

##理由
ownCloud公式にパッケージがあるけど、パッケージだとapacheも一緒にインストールされてしまう。
Gitlabを先にインストールして使っていたので、apacheはもう使いたくなかった。（検索してもapacheとnginxの同時運用は見つからないしね）

##手順
1.[公式サイト](http://software.opensuse.org/download/package?project=isv:ownCloud:community&package=owncloud)の手順でリポジトリ登録して
`sudo apt-get install owncloud`
まで実行


2.これだと、apache2 + owncloudの環境になる上にapache2のデフォルト
`/var/www/html`
以下にowncloudが構築される。

3.mysqlにユーザーとDB作成
*コマンドはちゃんと調べよう！*
`create database owncloud default character set utf8`
とか
`grant all privileges on owncloud.* to newuser@localhost identified by 'password'`
とか

4.apacheを停止する
`sudo /etc/init.d/apache2 stop`

5.nginxで設定ファイルを書く
[公式ドキュメント(ver9.2)](https://goo.gl/Zqe6Q9)に設定ファイルがあるので豪快にコピーして`/etc/nginx/site-available/owncloud`等でファイル作成
5.1 (バージョンが上がると場所が変わるのでメモ）owncloud Top>Documentation>ownCloudx.x>Administration Manual>Installation>nginx Example Configurations

6.nginxの設定ファイル書き換え
*server_nameは既にGitlabで動いているので削除する
*rootにはowncloudを設置したい場所を書く`/home/owncloud/`とか
*fastcgi_passを削除してコメントになっているソケットの方を有効にする

7.SSL証明書の作成と設定
[リンク先](http://goo.gl/9cnF7)の手順に従えば大丈夫。

8.owncloud本体を設定ファイルの位置に移動
ユーザーグループが変わって書き込みエラーになるのでnginxがアクセスできるようにする。
`sudo chown -R www-data www-data /home/owncloud`とか

9.nginx再起動
再起動する前にsite-available/owncloud をsite-enable/owncloud等にシンボリックリンクを作製しておくこと。
その後、おもむろに再起動
`sudo /etc/init.d/nginx restart`

-
以上

追記
~~この方法だと、パッケージはapacheで動作するようになっているのでパッケージのアップデートに失敗する。~~
~~インストール環境だけ残しておいて、毎回コピーする？~~
~~パッケージのconfigureオプションをいじる方法があれば、そちらで対応できるかな？~~
ubuntuでは、ownCloudのVersion 8くらいからapt-get upgradeでapacheの邪魔が入らずにアップデートされるようになったので最新版なら上の設定でも多分大丈夫。
Java での SSL3.0 無効化


http://www.oracle.com/technetwork/java/javase/documentation/cve-2014-3566-2342133.html

## Java7

#### java.net.URLConnection を使っている場合

以下のプロパティを指定する。

* `https.protocols=TLSv1,TLSv1.1,TLSv1.2`

#### HttpClient を使っている場合

クラス SSLConnectionSocketFactory にプロトコルを指定して、HttpClient に渡す。
http://stackoverflow.com/questions/26429751/java-http-clients-and-poodle

## Java8

以下のプロパティを指定する。

* `https.protocols=TLSv1,TLSv1.1,TLSv1.2`
* `jdk.tls.client.protocols=TLSv1,TLSv1.1,TLSv1.2`
rubyの問題

# 問 1 ランダムソート

* 1から10までの配列があります。
* ランダムに並べ替えてください。

※ただし、Array#shuffle, Array#shuffle!, Array#sample は使用しないでください。

```ruby:shuffle.rb
def f
  a = (1..10).to_a
  # -- ここにコードを記述してください。 --
end

# 三回出力してそれぞれランダムに並び替えられていることを確認します。
f
f
f
```

# 問 2 配列のソート問題

以下のようなに名前とそれぞれの項目の得点を記したCSVファイルがあります。
rubyの得点を基準に降順に並べ替え、名前とrubyの得点を出力しなさい。
また、平均点を計算し降順に並べ替え、名前と平均点を出力しなさい。
（平均点が同じ場合はrubyの点数が高い方を先に表示すること）


http://www.tm-21.co.jp/rubykaigi/ruby_1.csv

```csv:ruby_1.csv
name,ruby,php,python,perl
一郎,100,40,70,80
二郎,60,90,80,10
三郎,90,60,60,60
四郎,80,70,70,80
```

```ruby:sort.rb
require 'open-uri'
require 'csv'

# csvファイル取得先URL
url = 'http://www.tm-21.co.jp/rubykaigi/ruby_1.csv'

# -- ここにコードを記述してください。 --

# -- ここに出力をしてください。 --
```

# 問 3 スクレイピング

以下のアドレスにアクセスしてください。

http://www.tm-21.co.jp/rubykaigi/ruby_1.html

一見、みんなRubyに見えますが、実は仲間はずれがいます！
上記アドレスをRubyを使用して読込み、仲間はずれをさがしてください。
仲間はずれの理由と何番目のRubyかを出力してください。
※仲間はずれの理由に特に正解はありません。自由に考えてOKです。

```ruby:scraping.rb
require 'open-uri'

# スクレイピング先のURL
url = 'http://www.tm-21.co.jp/rubykaigi/ruby_1.html'

# -- ここにコードを記述してください。 --

# -- ここに出力をしてください。 --
```

# 問 4 確率の問題

0回から13回までのいずれかの回数だけトランプのカードを引けます。
引いたカードが、すべてスペードのカードである場合の確率を返すプログラムを作成してください。

以下は、トランプの内容です。

1. トランプの枚数は、52枚です。
1. トランプの絵柄は、「スペード、クローバー、ハート、ダイヤ」の4つです。
1. 絵柄ごとにカードは、13枚あります。
1. カードの種類は、「A 2 3 4 5 6 7 8 9 10 J Q K」の13種類です。