OmniAICreator/Qiita-1.07M huggingface dataset:
UDID確認アプリが全くアテにならない件

iPhoneアプリ開発で実機テストなどをするために
Appleのdevcenterに登録するUDIDという端末識別番号があります。

自分の端末のUDIDを調べるのに
専用のアプリがあったので、それを使ってみました。
（App StoreでUDIDと検索するといくつも出てきます）

そしたら

FFFFFFFF3D59B46B96694C5490D5D93A8565C965

というやたら長い文字列が出てきたので
これをdevcenterに登録しました。

にも関わらず、一向に実機テストが出来ない。

原因を調べているうちに
どうもこのUDIDが正しくないのでないかという疑念が湧いてきました。

そこで、別のUDIDアプリを使ってみたのですが、なんと

FFFFFFFFD826D3626E0242378B43F0D4A2C152BC

という似てるけど非なる文字列が出てきました

もちろんUDIDは１つしかないので
少なくともどちらかは間違っているはずですが
両方間違っている気がしてならなかったのでググってみたら
こんな情報が出てきました。

<strong><span style="font-size:large;"><a href="http://www.appbank.net/2013/03/22/iphone-news/568323.php" target="_blank" title="Apple、5月1日からUDIDにアクセスするアプリ・非iPhone 5最適化アプリはリジェクトと発表。 - たのしいiPhone！ AppBank">Apple、5月1日からUDIDにアクセスするアプリ・非iPhone 5最適化アプリはリジェクトと発表。 - たのしいiPhone！ AppBank</a></span></strong>

アプリからUDIDにはアクセスできなくなったらしい。
（正確にはリジェクトすると書いてあるだけなのが気になるが
普通に考えたらアクセスも出来なくするのだろう）

だとしたら、先のアプリなどは無用の長物だ。

どうも現在はこの手のアプリを使ってもエラー値が帰ってくるだけのようです。

ちなみにUDIDの正しい確認は、PCのiTunesから簡単でした。
<strong><span style="font-size:large;"><a href="http://social-q.jp/blog/253.html" target="_blank" title="ちなみにUDIDの正しい確認は、PCのiTunesから簡単でした。アプリのテストをするためのUDID取得方法">
アプリのテストをするためのUDID取得方法</a></span></strong>

僕もこれで時間を無駄にしてしまったので
メモとして残しておきます。
こまけぇこたぁいいんだ！MVWだ！

AngularJSってコントローラーとビジネスロジックとのコネクションに、FactoryとかServiceとかを提供してるんですが、これって使わなくても困らないなって思います。

AngularJSはMVW、即ちModel-View-Whateverを掲げています。つまり、「 **モデル（ビジネスロジック）と画面以外は、どうだっていい。MVCとかMVPとか、くだらない事を考える暇があったら手を動かせ** 」と言っているんですね。

FactoryとかServiceはfat-controller回避のための機能だと思うんですが、別にそんな機能使わなくてもmodule使えば回避できますよね。

例えばこんな感じ:

```ts
import opening = require('./domain/app/opening'); // <-- インポートして

var app = angular.module('app', ['ngRoute', 'ngAnimate']);

// 中略

app.controller('IndexController', [
    () => opening() // <-- コール
]);

angular.bootstrap(<any>document, ['app']);
```

こんな感じでAMDライブラリを読んでしまえるので、わざわざAngularJSに依存してビジネスロジックを書く必要性を感じないんですよね。

Factory、Serviceを使った方が便利ってシチュエーションあるんですかね？
多分あるんでしょうね。知っている方がいらっしゃいましたら教えてください。
一行条件処理(三項演算子ではない)→短絡評価(ショートサーキット)って言うらしい！

@osakanafish さんの[ifステートメントを使わない一行条件処理](http://qiita.com/osakanafish/items/844ae50c22345c52653c)
に関して。

**確かにこれは気持ち悪いw**

でもこの文は一瞬首を傾げたもののすぐに意味は理解できた。  

`&&`は左右両式が`True`の時に`True`を返す性質を利用したもの。

言語によって解釈方法に差異はありそうだけど多くの言語で
> `&&`はまず左を評価しtrueなら右も評価する

ってのが取られていたと思う。

実際Perlとかではよく使われていた気がする。(エラーを取るときの例外処理とか)(要するに色んな言語で使える)
ただ`&&`と`and`、`||`と`or`でそこら辺に違いがあったりしたような……(うろ覚え)

<small>とまぁ憶測だけで書いたメモ記事でした()</small>


PHPだと[この記事](http://qiita.com/mpyw/items/1ea553fea092f597169a#3-25)に書かれてたっぽい。
Google Feed APIを使おう

JavaScriptでRSS/ATOMを取得してサイトに表示したり加工して使ったりしたいんだけど、
そのままAJAXでやろうとしても、いわゆるSame Origin Policy でドメインが違うサイトのデータは取得できない。
そんなときは、Google Feed APIを使おう。

# 使い方
以下を読もう

https://developers.google.com/feed/v1/devguide?hl=ja

# サンプル

http://ameblo.jp/nazuki-airu/ のRSSを取得して各記事のリンクを作成する
下記がそのサンプル

```html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8" />
<script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load("feeds", "1");
function initialize() {
    var feed = new google.feeds.Feed("http://feedblog.ameba.jp/rss/ameblo/nazuki-airu/rss20.xml");
    feed.setNumEntries(10);
    feed.load(function(result) {
        if (!result.error) {
            for (var i = 0; i < result.feed.entries.length; i++) {
                var entry = result.feed.entries[i];
                $("#ret").append(
                    $("<div>").append(
                        $("<a>").attr("href", entry.link).text(entry.title))
                );
            }
        }
    });
}
google.setOnLoadCallback(initialize);
</script>
</head>
<body>
<div id="ret"></div>
</body>
</html>
```

結果は以下のようになる。

![rss_sample.png](https://qiita-image-store.s3.amazonaws.com/0/4044/093f3d4c-b9ec-be0d-92b2-42fc7cb601bc.png)
jenkinsのURLを変えてUserのiconが表示されなくなった時の対処法


## 現象
jebkinsにアクセスするためのポート番号を変更するなど、URLを変えた場合に、/user/username ページのアイコンが壊れて表示されない。

## 原因
設定ファイルの一部に古いURLがそのまま残っている箇所が一箇所あった。例えばポート番号を8080から何かに変えた場合、下記の様に打ってみると、

```
cd /var/lib/jenkins
grep 8080 *.xml
```

> hudson.tasks.Mailer.xml:  <hudsonUrl>http://hoge.com:8080/</hudsonUrl>

のように、hudson.tasks.Mailer.xmlに古いURLが残ったままであることがわかる。

## 対処法
* hudson.tasks.Mailer.xmlの該当箇所を正しいURLに修正する。
* `service jenkins restart`

以上でユーザーページのアイコンが表示される。
googlemapAPIでandroid端末に地図を表示出来ない時のトラブル

googlemapAPIでandroid端末に地図を表示させるのに苦労したので
メモとして残しておきます。

Manifest.xml内のAPIキーやパーミッション
google-play-services_libなどはネット上にたくさん情報があるのですが
それらを正しく設定しているはずなのになかなかうまく行きませんでした。
（起動時に「問題が発生したため終了します。」）

端末のgooglePlayServicesというアプリの
バージョンが古いことが原因でした。

ストアからダウンロードする際にアプリ名が「Google Play開発者サービス」となっていましたが
同じものです。
Ubuntu 13.10 に PHPMD をインストールする

まず PHP のバージョンを 5.2.3 以上にする必要があります。

http://phpmd.org/download/index.html

そして PHP_Depend というパッケージに依存しているため、先に PHP_Depend をインストールします。

```
sudo pear channel-discover pear.pdepend.org
sudo pear install pear.pdepend.org/PHP_Depend
```

そして下記の手順で PHPMD をインストールできます。

http://pear.phpmd.org/
ifステートメントを使わない一行条件処理



```javascript
if (num < 0) num = 0;
```

これは以下のようにも書くことができる。

```javascript
num < 0 && (num = 0);
```

2008年くらいのコード読んでたら上記のような一文が出てきて、なんだこりゃと思って調べた。
直感的に分かりづらいのであんまり好きじゃないなあ。
シンボリックリンクの向き先変更（ln -nfs TARGET LINK_NAME）

シンボリックリンクの向き先を変えたいときって結構あるけど、単純に`ln -s TARGET LINK_NAME`ってしたら怒られる（"ln: target: File exists"）。

そこで泣く泣く`rm -f LINK_NAME && ln -s TARGET LINK_NAME`ってしてたけど、便利な上書きオプション`-f`があった。
あぁわかりやすくて便利、`ln -fs TARGET LINK_NAME`。
（なんで今まであると思わなかったんだろう。。。）

[追記]
`TARGET`がディレクトリの時は、`-n`オプションも必要。
`ln -fs TARGET LINK_NAME`だけだと、`TARGET`がディレクトリの時に意図通りにならない。

```shell-session
$ ls -l
TARGET1/
TARGET2/

$ ln -fs TARGET1 LINK_NAME  # 1回目は大丈夫
$ ls -l
LINK_NAME -> TARGET1/
TARGET1/
TARGET2/

$ ln -fs TARGET2 LINK_NAME  # 2回目は．．．
$ ls -l
LINK_NAME -> TARGET1/       # 向き先が変わっていない
TARGET1/
TARGET2/
$ ls -l LINK_NAME/
TARGET2 -> TARGET2          # なんと循環参照してしまっている 
```

これは`-n`オプションで回避できる。このオプションはずばり、`LINK_NAME`がディレクトリを指すシンボリックリンクの場合、通常のファイルとして扱うというもの。

```shell-session
(続き)
$ ln -nfs TARGET2 LINK_NAME
$ ls -l
LINK_NAME -> TARGET2/       # ちゃんと向き先が変わっている
TARGET1/
TARGET2/
```

結論。シンボリックリンクの向き先を変えるときは、`ln -nfs TARGET LINK_NAME`がオススメ。


参考 [[man ln](http://linuxjm.sourceforge.jp/html/GNU_fileutils/man1/ln.1.html)]
ssh -Aでローカルの秘密鍵を使う


新しいLinux環境を作った時に、もろもろの設定をgithubの自分のリポジトリから取ってくる仕組みにしているのですが、githubからcloneするために秘密鍵を~/.sshにおいたりパーミッションを適切に設定したりという作業をするのが面倒でそれも含めて自動化できないもんかな〜と言っていたら「それssh -Aでローカルの秘密鍵を使えばいいんだよ」という話を聞いた。
AVAudioPlayerで次の曲を再生する方法


##背景
AVAudioPlayerDelegateのaudioPlayerDidFinishPlayingメソッドでは、音楽の再生が終わったことを検知することができるが、次の曲を再生する方法がわからなかった。

##解決方法
以下のようにすることで実現できた。
１．現在再生中のインデックスを保持する。
２．MPMediaItemCollectionから次の曲を取り出して設定する。
３．最後の曲を再生した場合は曲を停止する。


```Objective-C:Player.h
@interface Player : UIViewController <AVAudioPlayerDelegate>
@property (nonatomic) AVAudioPlayer *player;
@property (nonatomic) MPMediaItemCollection *mediaItems;
@property (nonatomic) NSInteger currentItem;
@end
```

```Objective-C:Player.m
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
    [self play];
}

- (void)play {
    // 曲情報はmediaItemsに追加済み
    if (self.currentItem >= self.mediaItems.count) {
        // 停止する
        [self.player stop];
        self.player = nil;
        return;
    }
    
    // 次に再生したい曲情報をMPMediaItemに設定する
    MPMediaItem *item = [[self.mediaItems items] objectAtIndex:self.currentItem];
    NSURL *url = [item valueForProperty:MPMediaItemPropertyAssetURL];
    self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    self.player.delegate = self;
    [self.player play];
    
    self.currentItem++;
}

```
iOSでProj.4別解

2つ前の記事から続いているProj.4ネタ、pj_transformの動作確認をするのにiOS開発環境を使ったので、その設定方法を。
iOSでのProj.4の導入方法は、[こちらの記事](http://qiita.com/glayash/items/882d101f4a49db28090c)でも紹介されていて、Route-meも私もずっと使ってた良プロダクトなので一緒に広まってくれれば嬉しいのだけど、Proj.4だけを使うなら別解もあるのでご紹介を。

## cocoapodsを使う

[cocoapods](http://cocoapods.org/)は、iOS開発環境向けのパッケージ管理システムです。
知ってる人ならこれだけで説明終了なのかもしれません。
私は知らなかったので、同様に知らない人のためにざっくり手順説明しますと、

### cocoapodsのインストール

まずcocoapods自身をインストールします。
Macのデフォルトrubyで大丈夫なようです。

```shell-session
sudo gem install cocoapods
```

これだけでうまくいかなければ、[こちら](http://guides.cocoapods.org/using/getting-started.html#getting-started)あたりを参照してください。

### Xcode commandline toolのインストール

proj.4のコンパイルにcommandline toolが必要なので、インストールします。
Xcodeのバージョンに応じて、Preferenceから選択するとか、xcode-selectコマンドを実行するとか情報が錯綜してますが、MarvericksでXcode5.0.2の環境では、[こちらの記事](http://iti.hatenablog.jp/entry/2014/02/14/124319)のやり方が正しいようです。

また、もうちょっと先の手順、pod installの実行時に

```shell-session
LoadError - no such file to load -- xcodeproj/prebuilt/universal-darwin13.0-1.8.7/xcodeproj_ext
```

こういうエラーが出て停止する場合は、やはりcommandline toolが入ってないか古い事が原因なので、この項に沿ってcommandline toolをインストールしてください。

### 新しいXcodeプロジェクトを作成する

Proj.4を導入したいプロジェクトをXcodeで作ります。
既にあるプロジェクトに導入する場合は、必要ないです。
作った後は、コマンドライン作業になるので一旦Xcodeを落とします。

### Podfileを作る

Podfileというのは、cocoapodsのどのパッケージを導入するかをまとめた設定ファイルです。
コマンドラインでXcodeプロジェクトのディレクトリに移り、その直下にPodfileという名前で以下の内容を書きます。

```text:Podfile
platform :ios
pod 'proj4'
```

### pod installを実行する

Podfileを作ったXcodeプロジェクトのディレクトリ直下で、次のコマンドを実行します。

```shell-session
pod install
```

するとProj.4のパッケージがダウンロードされて、コンパイルされて、最終的に **プロジェクト名.xcworkspace** というファイルが出来ます。

### プロジェクト名.xcworkspace をXcodeで開く

通常、Xcodeの開発では、 プロジェクト名.xcodeproj ファイルでプロジェクトを開くと思いますが、cocoapodsでパッケージ導入後は、 プロジェクト名.xcworkspace ファイルを開いて開発するようにします。

### proj_api.hをimportして開発

プロジェクトを開くと、自プロジェクトの他にProj.4のプロジェクトも読み込まれ、リンクも張られているので、後は

```objc
#import <proj_api.h>
```

を書いてProj.4のAPIを使えばOKです。
使い方の基本は、[先に紹介した記事](http://qiita.com/glayash/items/882d101f4a49db28090c)と同じなので割愛します。

## SpatialDBKitを使えば、その他のプロダクトも導入可能

以上、cocoapodsを使ったProj.4の導入法を紹介しましたが、その他の有名なFOSS4Gライブラリ群、GEOSやspatialite等も、[SpatialDBKit](https://github.com/andreacremaschi/SpatialDBKit)という名前でcocoapodsに登録されていますので、同様に簡単に導入することができます。
特定のURLの時はWebViewでなくブラウザで表示する方法


iOSアプリでWebViewを使うことは多々あるかと思います。

そんなWebViewで、表示しているWebViewで特定のリンクはWebViewで表示するのではなくてブラウザを起動したいというケースがあります。


そういう時は以下のサンプルコードの`http://example.com `を好きなアドレスに変更すればOKです。

```objectivec:サンプルコード
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    if (navigationType == UIWebViewNavigationTypeLinkClicked) {        
        NSString *checkURL = [request.URL absoluteString];
        NSRange linkMatch  = [checkURL rangeOfString:@"http://example.com"];
 
        if (linkMatch.location != NSNotFound) {
          [[UIApplication sharedApplication] openURL:request.URL];
          return NO;
        }
    }
 
    return YES;
}
```

UIWebViewNavigationTypeLinkClickedは、見ての通りWebviewでのリンクをクリックした時のことを指しています。
なので、別に特定のURLの時に限らず「http[s]://」ならブラウザで表示するといったことも出来ます。
その時は、[request.URL scheme]で判断すればOKです。
std::multimap memo


いつも忘れるので使いかたメモ

```cpp
#include <iostream>
#include <map>
#include <string>

using namespace std;

void dump(multimap<float, string>::iterator begin, multimap<float, string>::iterator end)
{
	multimap<float, string>::iterator it = begin;
	
	cout << "---" << endl;
	while (it != end)
	{
		cout << it->first << ": " << it->second << endl;
		it++;
	}
	cout << "---" << endl << endl;
}

void dump(multimap<float, string>& m)
{
	dump(m.begin(), m.end());
}

int main(int argc, char *argv[]) {
	
	multimap<float, string> m;
	
	// 要素追加
	m.insert(make_pair(0, "test0"));
	m.insert(make_pair(1, "test1"));
	m.insert(make_pair(2, "test2"));
	dump(m);
	//	---
	//	0: test0
	//	1: test1
	//	2: test2
	//	---


	// 重複した要素があってもOK
	m.insert(make_pair(0, "doubled0"));
	m.insert(make_pair(1, "doubled1"));
	dump(m);
	//	---
	//	0: test0
	//	0: doubled
	//	1: test1
	//	2: test2
	//	---

	
	// キーを指定して要素を取得
	{
		std::pair<multimap<float, string>::iterator, multimap<float, string>::iterator> range = m.equal_range(1);
		dump(range.first, range.second);
	}
	//	---
	//	1: test1
	//	1: doubled1
	//	---



	// 範囲指定で要素を取得 [0, 1)
	{
		multimap<float, string>::iterator begin = m.lower_bound(0);
		multimap<float, string>::iterator end = m.lower_bound(1);
		dump(begin, end);
	}
	//	---
	//	0: test0
	//	0: doubled0
	//	---


	// 範囲指定で要素を取得 [0, 1]
	{
		multimap<float, string>::iterator begin = m.lower_bound(0);
		multimap<float, string>::iterator end = m.upper_bound(1);
		dump(begin, end);
	}
	//	---
	//	0: test0
	//	0: doubled0
	//	1: test1
	//	1: doubled1
	//	---


	// 要素の削除
	m.erase(0);
	dump(m);
	//	---
	//	1: test1
	//	1: doubled1
	//	2: test2
	//	---


	// 狙った要素だけ取り出し
	{
		int n = m.count(1);
		multimap<float, string>::iterator it = m.find(1);
		for (int i = 0; i < n; i++)
		{
			if (it->second == "doubled1")
			{
				cout << "found: at index " << i << endl;
			}
			it++;
		}
		
		cout << endl;
	}
	
	
	// 狙った要素だけ削除
	{
		string to_remove_string = "doubled1";
		
		int n = m.count(1);
		multimap<float, string>::iterator it = m.find(1);
		for (int i = 0; i < n; i++)
		{
			if (it->second == to_remove_string)
			{
				m.erase(it);
			}
			else
				it++;
		}
	}
	dump(m);
	//	---
	//	1: test1
	//	2: test2
	//	---

}
```
Emacs Lisp の正規表現、$ と \' の違い

よく忘れるのでメモ。

正規表現で文字列の末尾を表現するときには `$` を使いますよね。
Emacs Lisp ではもう一つの記述方法として `\\'` があります。

たとえば Emacs でファイルを開くときに特定のメジャーモードを設定したいとき、
変数 auto-mode-alist にファイル名のパターンとメジャーモードをセットします。
拡張子を指定するときは `.html$` とか `.txt$` とか `$` で終わる正規表現を書きそうなものですが
デフォルトの定義は `\\'` を使っています。

```el:files.el
(defvar auto-mode-alist
  ;; Note: The entries for the modes defined in cc-mode.el (c-mode,
  ;; c++-mode, java-mode and more) are added through autoload
  ;; directives in that file.  That way is discouraged since it
  ;; spreads out the definition of the initial value.
  (mapcar
   (lambda (elt)
     (cons (purecopy (car elt)) (cdr elt)))
   `(;; do this first, so that .html.pl is Polish html, not Perl
     ("\\.s?html?\\(\\.[a-zA-Z_]+\\)?\\'" . html-mode)
     ("\\.te?xt\\'" . text-mode)
     ("\\.[tT]e[xX]\\'" . tex-mode)
...
```

`$` では動作しないのかというとそんなことはなく、きちんと拡張子にマッチします。

ではなぜ `\\'` を指定するのか。

`\\'` はバッファまたは文字列の末尾にマッチします。
一方、`$` はバッファと文字列と行の末尾, つまり改行の直前にもマッチします。
複数行からなる文字列の末尾にマッチさせるときに `m フラグ` を指定する言語がありますが
Emacs Lisp の `$` は `m フラグ` **あり** のときの動作になります。

拡張子はファイル名という改行を含まない文字列の末尾ですから `\\'` で十分なんですね。
ActivityNotFoundExceptionが出たら疑うのはAndroidManifest.xml


AndroidManifest.xmlのActivityタグ内でandroid:name属性を確認すると
存在しないActivity名になっているか、パスが間違っている場合があります。

##意外と起こりがちなケース
eclipseはパッケージ間を移動した場合に自動でパスを変換してくれる機能があります。
これがたまに壊れてAndroidManifest.xml内の中身がごちゃごちゃになる場合があります。

そーなると上記のようにパスやActivity名が存在しないものになり例外を吐くようになってしまいます。

**AndroidManifest.xmlはいじっていないのに出た場合はこれを疑ってください。**
Goで二次元配列の初期化を一行で行う

正確にはスライスのスライスです

```go
matrix := [][]float64{{0, 0}, {0, 1}, {1, 0}, {1, 1}}
```

以下と等価

```go
matrix := make([][]float64, 4)
matrix[0] = []float64{0, 0}
matrix[1] = []float64{0, 1}
matrix[2] = []float64{1, 0}
matrix[3] = []float64{1, 1}
```


```go
fmt.Println(matrix) // [[0 0] [0 1] [1 0] [1 1]]

```
ブックマークレットを作るときのTips

##名前空間を汚染しない

```js
//javascript:
(function(){document.getElementsByTagName("title")[0].innerText;})()
```

特に多くのページで利用されるブックマークレットは、平凡な変数名だと既に存在する変数名とバッティングする可能性が高いので、このように `(function(){...})()` することが重要になってきます。関数ブロックは変数スコープを作り、 この中で `var` で宣言した変数は外部で使われる同名の変数と別のものになります。

また、このようにすることでブックマークレット全体の実行結果として何も返さない(voidを返す)ことも都合が良いです。

すべての変数は無名関数ブロックの変数スコープ内で `var` を使って宣言しましょう。`var` は複数の代入をコロンで区切って宣言することができます。

```js
var div = document.createElement("div"),
    content = div.innerHTML,
    abc,
    xyz = document.getElementById("xyz");
```

（上記は実際には一行にまとめられます）

ブックマークレットでは文字数の少なさが重要です。また`var`宣言はスコープの冒頭に巻きあげられる性質があるので、使う変数は関数ブロックの冒頭にまとめて宣言しておいたほうが混乱がないと思います。

##引数を活用する

```js
//javascript:
(function(d,l,e){/* some code*/})(document,location,encodeURIComponent);
```

良く書く`document`といった組み込みオブジェクト等の短縮記法として引数活用をするとよい場合があります。

##デバッグにconsole.log()を利用する

FirefoxやChromeなど、最近のモダンブラウザはデバッガが標準で付いていたりFirebugなどのデバッガを入れることができるようになりました。

その時にデバッグ出力をデバッガのコンソールに `console.log()` メソッドで出力することができるので、何が起こっているのかプリントデバッグのようなことができます。`alert()`でもよいのですが、オブジェクトを出力させたときにChromeでは中身を表示してくれるといったことを`console.log()`はしてくれたりするのでオススメです。

##はてなletを活用する

- http://let.hatelabo.jp/

ブックマークレットを公開するための便利なツールです。デバッグレットという作りながら試せる機能もあります。

##JavaScriptのコンプレッサーを使う

長いブックマークレットになってくると、最初から一行で書くのはつらくなってきます。公開したくないブックマークレットだと、はてなletを使うわけにもいかないですね。

そういうときには、 **Google Closure Compiler**  や **YUI Compressor** などの JavaScript コードを一行にまとめるコンプレッサーの類を使うことも検討しましょう。

ただ、上記ツールはJava製なので、JavaVMなどが入っていないと使えなかったりするので面倒です。

私(@[xtetsuji](https://twitter.com/xtetsuji))の[bookmarklet GitHubリポジトリ](https://github.com/xtetsuji/bookmarklet)には、`js2let.pl`という簡単なPerlプログラムがあります。真面目な構文解析などはしていないので複雑なことをしているスクリプトが壊れる事もありますが、たいていの小さなブックマークレット用JavaScriptは問題なく一行にできると思います。Perlの外部モジュールへの依存もないので、どこにでも入っているPerlで使うことができます。

##大きなスクリプトは外部読み込みを使う

はてなletのデバッグレットでも同じ仕組みを使っていますが、大きなJavaScriptプログラムをブックマークレットにしようとした場合、ブックマークレットの長さの制限に引っかかったり可搬性が低かったりする可能性があります。そういう場合にはブックマークレットから外部JavaScriptファイルを外部読み込みする方法があります。

```js
(function(){
  var s = document.createElement("script");
  s.src = "http://example.jp/big.js"; /* あなたの書いたプログラム */
  document.body.appendChild(s);
  /* この後に追加処理を書いていく */
})()
```

これを一行にしたものをブックマークレットとすればよいでしょう。詳しくは「createElement ブックマークレット」などで検索してみると良いと思います。

読み込まれるJavaScriptはbody要素の内容に追加される( `</body>` の直前にscript要素が入る)ので、 **既存のページの名前空間を汚染する** ことを念頭に置くことができれば特に問題は起こらないでしょう。

##参考

- [Qiitaのbookmarkletタグ](http://qiita.com/tags/bookmarklet)
XAMPP for Macでのバーチャルホスト設定


## バーチャルホストを有効にする
「/Applications/XAMPP/xamppfiles/etc/httpd.conf」を開き、下記のコメントを外します。

```
#Include /Applications/XAMPP/etc/extra/httpd-vhosts.conf
```
　　↓

```
Include /Applications/XAMPP/etc/extra/httpd-vhosts.conf
```

## バーチャルホストを追加

「/Applications/XAMPP/xamppfiles/etc/extra/httpd-vhosts.conf」ファイルを開きます。

「\#NameVirtualHost *:80」の行を有効にする必要があるので、コメントアウトになっている場合は#を削除し、その行を有効にします。

```apache
#
# Use name-based virtual hosting.
#
#NameVirtualHost *:80
```

バーチャルホストが有効になったことで"http://localhost/"が無効になるので、以下を追加して復元してあげましょう。

```apache
<VirtualHost *:80>
    DocumentRoot "/Applications/XAMPP/xamppfiles/htdocs"  
    ServerName localhost
</VirtualHost>
```

#### バーチャルホストを追加
以下の参考にバーチャルホストを追加します。

例："site01"を追加する場合 はこんな感じで書き加えます。
DocumentRootの場所は任意の場所が指定できます。

```apache
<VirtualHost *:80>
    DocumentRoot "/Users/taro/server/site01"
    ServerName site01  
</VirtualHost> 
```

## hostsを書き換える
「/etc/hosts」を開き、以下を書き加えます。

```
192.168.1.11 site01
127.0.0.1    site01
```

通常はローカルホストを示す「127.0.0.1」を指定しますが、LAN内の他の端末からsite01にアクセスしたい場合はバーチャルホストの配置されているIP「192.168.1.11」でホストを追加します。適用されるホストの順番は上か下に行われます。

※ 補足：
Web開発でhostsファイルを編集することがよくあるので、hostsファイルを書き換えるのに便利なHosterも検討してみてださい。

[Hoster公式ホームページ](http://www.redwinder.com/macapp/hoster/)

## 動作確認
XAMPPを起動しApacheのStartボタンをクリックして起動します。あとはブラウザを立ち上げ「http://site01」と入力してアクセスしサイトが表示されればOKです。

※ 補足:
「/Users/taro/server/site01」の直下に「index.html」がある場合は自動でこのファイルが表示されます。



## LAN内の他の端末からバーチャルホストにアクセスする
LAN内の他の端末からバーチャルホストにアクセスする場合、その端末のhostsを書き換えます。ここではWindwos8/8.1の場合について説明します。

「C:\Windows\System32\Drivers\etc\hosts」を右クリックしてエディタを選択し開きます（ここでは秀丸を選択しています）。

![](https://qiita-image-store.s3.amazonaws.com/0/37668/bf730f69-e15c-190b-df6a-da23db8e3df3.png "スクリーンショット 2014-02-22 18.42.19.png")

秀丸を選択すると以下のダイアログが出るので「管理者として実行」をクリックします。

![](https://qiita-image-store.s3.amazonaws.com/0/37668/6785b990-484a-25e2-e65b-caa0443e106c.png "スクリーンショット 2014-02-22 18.43.04.png")

開いたら以下を追加します。

```
192.168.1.11 site01
```

あとIEなどで「http://site01」にアクセスできるようになります。
Emacs: カレントディレクトリからファイラ(Finder)を起動する


ファイラは、exprolerでもnautilusでも起動できるはず。

```cl:.emacs
; カレントディレクトリから、ファイラ(Finder)を起動
(defun launch-filer-from-current-direcotry ()
  "launch finder from current directory"
  (interactive)
  (shell-command "open ." nil))
(define-key global-map (kbd "C-x f") 'launch-filer-from-current-direcotry)
```
Pythonでcssutilsを使ったCSSのパース

Python でwebサイトをスクレイピングしていて、タグの `style` 属性にインラインで書かれているCSSの解析が必要になった際のメモ。

## ライブラリの選定

[Beautiful Soup](http://www.crummy.com/software/BeautifulSoup/bs4/doc/) ではCSSを扱うことができないようなので、要件を満たすライブラリを探す。

PyPIで検索して、上位に出てきた [cssutils](https://pypi.python.org/pypi/cssutils/) を使ってみることにした。 [ドキュメント](http://pythonhosted.org/cssutils/) がきちんと書かれていて、開発も続いているようなので良さそうな感じ。

今回は Python 3.3.3 の環境で試してみた。インストールは `pip` で一発。

```console
$ python -V
Python 3.3.3
$ pip install cssutils
```

## CSSのパース

今回はインラインのCSSを解析するので `cssutils.parseStyle` を使用する。パース用のインターフェースは色々と用意されていて、今回は試していないがファイル名やURLを指定してパースすることもできるようだ。また、オプショナルな引数で文字コードを指定することもできる。

```pycon
>>> from cssutils import parseStyle
>>> style = parseStyle('width: 300px; margin: 0 20px 0 10px;')
>>> type(style)
<class 'cssutils.css.cssstyledeclaration.CSSStyleDeclaration'>
```

インラインのCSSをパースすると、 `cssutils.css.CSSStyleDeclaration` クラスのオブジェクトが得られる。ここから `width` や `margin` プロパティで指定されている値を取得することが今回やりたいことだ。

## プロパティと値の取得

プロパティの値を文字列で取得するだけなら簡単である。

```pycon
>>> style.width
'300px'
>>> style.margin
'0 20px 0 10px'
```

値が複数の要素で構成されている場合や単位を考慮したい場合など、もう少し詳細に解析したいときは `cssutils.css.Property` クラスと `cssutils.css.PropertyValue` クラスのオブジェクトを使用する。

```pycon
>>> p = style.getProperty('margin')
>>> type(p)
<class 'cssutils.css.property.Property'>
>>> v = p.propertyValue
>>> type(v)
<class 'cssutils.css.value.PropertyValue'>
```

`cssutils.css.PropertyValue` クラスは複数の要素で構成されている値を個別に扱うことができる。

```pycon
>>> v.length
4
>>> v[0]
cssutils.css.DimensionValue('0')
>>> v[1]
cssutils.css.DimensionValue('20px')
```

値の各要素はリスト風の操作で取得することができる。今回は `cssutils.css.DimensionValue` クラスのオブジェクトが返ってきた。このクラスは `px` や `em` などの単位を扱うことができる。

```pycon
>>> v[1].value
20
>>> v[1].dimension
'px'
>>> v[1].cssText
'20px'
```

他にも `cssutils.css.ColorValue` や `cssutils.css.URIValue` などといったクラスが用意されており、値の形式によって適切なオブジェクトが生成されるようだ。

## まとめ

- [cssutils](https://pypi.python.org/pypi/cssutils/) を使うことで、PythonでCSSをパースすることができる。
- 複数の要素からなる値や単位付きの値を簡単に扱うことができる。
gitプロジェクトのルートディレクトリ名を取得する

`locate-dominating-file`は、第一引数のディレクトリからディレクトリ構造を親方向にたどり、
第二引数と等しい名前のファイルやディレクトリを含むディレクトリの名前を返します。
第二引数と等しい名前のファイルやディレクトリが見つからない場合は、`nil`を返します。

カレントバッファのディレクトリは`default-directory`で参照できるので、
カレントバッファのgitプロジェクトのルートディレクトリ名は、次のようにして取得できます。

```el
(locate-dominating-file default-directory ".git")
```
MarkdownでTables内に'|'（バーティカルバー,縦線）を使う方法


##バーティカルバー？
パイプ処理やら絶対値やらブロック変数やらに使う'|'の記号。
これって[バーティカルバー](http://ja.wikipedia.org/wiki/%E3%83%90%E3%83%BC%E3%83%86%E3%82%A3%E3%82%AB%E3%83%AB%E3%83%90%E3%83%BC)って言うんですってよ、奥さん。

##エスケープさせても'|'が使えない
Markdownではテーブル表示する用に使用されてるんですが、
そのテーブル内で使いたい時にエスケープさせても効かなくて。

```
| abc | xyz |
|-----|-----|
| A|C | X|Z |
| A¥|C | X¥|Z |
```
↓

| abc | xyz |
|-----|-----|
| A|C | X|Z |
| A¥|C | X¥|Z |


##解決法
`&#124;`か`&#x7C;`を使いましょう。

```
| abc | xyz |
|-----|-----|
| A&#124;C | X&#124;Z |
| A&#x7C;C | X&#x7C;Z |
```
↓

| abc | xyz |
|-----|-----|
| A&#124;C | X&#124;Z |
| A&#x7C;C | X&#x7C;Z |

##最後に
つまりは[文字参照](http://ja.wikipedia.org/wiki/%E6%96%87%E5%AD%97%E5%8F%82%E7%85%A7)が使えますよ、ってことで。
JavaScriptで文字列と数値リテラルを使わずにHello World

何を今更、って感じですが書きたくなったので許してください。

元ネタ=> https://codeiq.jp/ace/cielavenir/q431

僕が書いたらこんな風になりました。

```js
var
zero    = +String.prototype,
one     = -~zero,
two     = one << one,
four    = one << two,
hundred = ({} + zero).charCodeAt(two) + two;

console.log([
  (two << four) * two + (two << two),
  hundred + one,
  hundred + (two << two),
  hundred + two * two * two,
  Number(Array() + one + one + one),
  two << four,
  hundred - (one + two << two | one),
  hundred + ((one << two << one) | two | one),
  hundred + ((one << four) - one ^ one),
  hundred + parseInt((one << four) + (two << two) - two, two | one),
  hundred
].map(function (x) {
  return String.fromCharCode(x);
}).join(Array().join()));
```

実行環境はnode.jsですがブラウザでも`console`オブジェクトがあれば動きそうな気がします。

変数名が分かりやすいのでそんなに難しくないと思います。
`"l"`が三回も出てくるので別の表現にするのが面倒になって3進数とか使いましたが…。
cocoapodsを導入したプロジェクトでアーキテクチャ周りのビルドエラーになる時


# 解決方法

- 各プロジェクト設定の"Architectures"を揃えているかどうか確認
- 各プロジェクト設定の"Build Active Architecture Only"で矛盾がないか確認

# 具体的な話

例はMixpanelをcocoapods経由で組み込んだ際のビルドエラー

```
"_OBJC_CLASS_$_Mixpanel", referenced from:
objc-class-ref in STAnalytics.o
```

エラーログの上の方を見ていくとかなり詳細に状態が表示されていた

```
Pods was rejected as an implicit dependency for 'libPods.a' because its architectures 'armv7s' didn't contain all required architectures 'armv7 armv7s arm64'
```

cocoapodsを使う場合Xcodeはワークスペースを使うが、実際のプロジェクトは'armv7 armv7s arm64'でビルドされるべきなのに、cocoapodsのプロジェクトは'armv7s'しかビルドしていなかったために発生していた様子。

Stackoverflowで同じような症状と解決策を探してみると、podsのプロジェクトの"Build Active Architecture Only"をYESからNOにすべしとあった

CocoaPods arm64 issue
http://stackoverflow.com/questions/19419781/cocoapods-arm64-issue

![スクリーンショット 2014-02-22 15.47.09.png](https://qiita-image-store.s3.amazonaws.com/0/16400/4c0286ad-aeea-e842-633e-701b7152f569.png "Xcodeのpodsプロジェクト設定")

図のようにどうやらデフォルトYESになっていて、これをNOにすべしということらしい。実際にNOにしてビルドエラーはなくなった。

## デフォルトYESなのは理由がある

"Build Active Architecture Only"はビルドしようとしているアクティブなアーキテクチャのみバイナリを生成するかどうかなので、例えばiPhone5(armv7s)実機で開発作業の検証を行っている時はarm64のビルドなどしなくて良いのではないかと思う。よって、開発プロジェクト側もDebugの"Build Active Architecture Only"をpodsプロジェクトと併せてYESにするとビルドが出来るようになった。

おそらく全部NOに統一してしまっても開発はできるが特定の端末で動作を確認したい場合でも全部NOに統一するのはビルド時間が無駄なはず。

## まとめ

- Debug,Release毎に各プロジェクトの"Build Active Architecture Only"を揃える
- Xcodeから特定の実機で検証したい場合はDebugビルドの"Build Active Architecture Only"はYES
- それ以外（例えばAdHocやRelease）の場合はNOにする


## 参考

xcodeのarmv7sビルドエラー
http://spacetimebubble.net/2012/12/26/xcode%E3%81%AEarmv7s%E3%83%93%E3%83%AB%E3%83%89%E3%82%A8%E3%83%A9%E3%83%BC/


Xcode 4.2でarmv6が必要だって怒られる場合の対処方法
http://d.hatena.ne.jp/paraches/20111029
build openrave on Ubuntu 13.10 (saucy)

初投稿。
公式リリースされてないけどbuildはできたのでその方法を書きとめる。

````
    sudo apt-get install libboost-thread libboost-date-time python-numpy libglew-dev libboost-graph-dev libboost-wave-dev libboost-serialization-dev libboost-filesystem-dev libpcre3-dev libboost-thread-dev libassimp-dev libopenscenegraph-dev qt4-dev-tools libqt4-dev libqt4-opengl-dev libqt4-dev-bin libqhull-dev libann-dev libpcre++-dev libbullet-dev libavformat-dev libavcodec-dev libboost-regex-dev libboost-python-dev libswscale-dev libode-dev libsoqt4-dev liblapack-dev

    git clone https://github.com/rdiankov/openrave
    cd openrave
    mkdir build
    cd build
    cmake .. -DOPT_DOUBLE_PRECISION=ON
````


ipythonのversionが違うとopenrave.py -iが動かないので、訂正するpatch:

````
    diff --git a/python/openrave.py.in b/python/openrave.py.in
    index df21b33..b0b7064 100644
    --- a/python/openrave.py.in
    +++ b/python/openrave.py.in
    @@ -205,6 +205,10 @@ if __name__ == "__main__":
                         api_version = '0.10'
                     elif IPython.__version__.startswith("0.11"):
                         api_version = '0.11'
    +                elif IPython.__version__.startswith("0.12"):
    +                    api_version = '0.12'
    +                elif IPython.__version__.startswith("0.13"):
    +                    api_version = '0.13'
                         
                     # start ipython in a separate thread
                     def ipythonthreadfn(env):
    @@ -217,7 +221,7 @@ if __name__ == "__main__":
                             if api_version == '0.10':
                                 ipshell = IPython.Shell.IPShellEmbed(argv='',banner = 'OpenRAVE %s dropping into IPython, variables: env, robot, body'%openravepy.__version__,exit_msg = 'Leaving Interpreter and closing program.')
                                 ipshell(local_ns=locals())
    -                        else:
    +                        elif api_version == '0.11':
                                 from IPython.terminal import embed; ipshell=embed.InteractiveShellEmbed(config=embed.load_default_config())(local_ns=locals())
     #                             from IPython.config.loader import Config
     #                             cfg = Config()
    @@ -226,6 +230,12 @@ if __name__ == "__main__":
     #                             #IPython.embed(config=cfg, banner2 = 'OpenRAVE %s dropping into IPython, variables: env, robot, body'%openravepy.__version__)
     #                             from IPython.frontend.terminal.embed import InteractiveShellEmbed
     #                             ipshell = InteractiveShellEmbed(config=cfg)
    +                        elif api_version == '0.12' or api_version == '0.13':
    +                            from IPython import embed
    +                            embed()
    +                        else:
    +                            raise StandardError("no appropriate embed shell to this version of openrave")
    +
                         finally:
                             # ipython exited. if viewer is valid, then exit the viewer also
                             if viewer is not None:
````
AngularJSのngAnimateでアニメーション中のみ共通のローディングダイアログを表示

こういう感じのをローディングダイアログをtemplateの切り替わり中だけ自動ででるようにする。
![スクリーンショット 2014-02-22 16.00.03.png](https://qiita-image-store.s3.amazonaws.com/0/8152/1328daee-dfa5-ac45-5e9d-04c15dae9c5a.png)

rootScopeのincludeContentRequestedとincludeContentLoadedをフックにダイアログの表示/非表示を切り替えようとしたんだけど上手くできなかったので、結局CSSで実装した。

ベースの実装は下記参考にした。
http://blog.asial.co.jp/1236


ローディングダイアログ部分は下記

```scss
/* ローディングダイアログ */ 
#loading-dialog {
	display: none;
	width: 100px;
	height: 100px;
	text-align: center;
	position: fixed;
	top: 50%;
	left: 50%;
	margin-top: -50px;
	margin-left: -50px;
	z-index: 100;
	padding: 10px;
	background: rgba(0,0,0,0.7);
	opacity: 0.5;
	color: #111;
	-webkit-border-radius: 7px;
	-moz-border-radius: 7px;
	border-radius: 7px;
	font-size: 11px;
	.spinner {
		margin: 6px auto 0 auto;
		width: 70px;
		text-align: center;
		.bounce1 {
			-webkit-animation-delay: -0.32s;
			animation-delay: -0.32s;
		}
		.bounce2 {
			-webkit-animation-delay: -0.16s;
			animation-delay: -0.16s;
		}
	}
	.spinner > div {
		width: 18px;
		height: 18px;
		margin-top: 20px;
		background-color: rgba(255,255,255,0.8);
		border-radius: 100%;
		display: inline-block;
		-webkit-animation: bouncedelay 1.4s infinite ease-in-out;
		animation: bouncedelay 1.4s infinite ease-in-out;
		/* Prevent first frame from flickering when animation starts */
		-webkit-animation-fill-mode: both;
		animation-fill-mode: both;
	}
	.str{
		padding-top: 10px;
		em{
			color: rgba(255,255,255,0.8);
			font-weight: bold;
			font-size: 14px;
		}
	}
}
@-webkit-keyframes bouncedelay {
    0%, 80%, 100% { -webkit-transform: scale(0.0) }
    40% { -webkit-transform: scale(1.0) }
}
@keyframes bouncedelay {
    0%, 80%, 100% {
        transform: scale(0.0);
        -webkit-transform: scale(0.0);
    } 40% {
        transform: scale(1.0);
        -webkit-transform: scale(1.0);
    }
}

/* アニメーション中だけローディングダイアログ表示 */
.slide-animate.ng-leave + #loading-dialog,
.slide-animate.ng-enter.ng-enter-active + #loading-dialog {
	display: none;
}
.slide-animate.ng-enter + #loading-dialog,
.slide-animate.ng-leave.ng-leave-active + #loading-dialog {
	display: block;
}
```

```html
<div id="main_content" class="slide-animate-container">
	<div class="slide-animate" ng-include="template.url" >
	</div>
	<div id="loading-dialog" ng-controller="DialogCtrl">
		<div id="spinnerLoader">
			<div class="spinner">
				<div class="bounce1"></div>
				<div class="bounce2"></div>
				<div class="bounce3"></div>
			</div>
		</div>
		<div class="str"><em>Loading</em></div>
	</div>
</div>
```
はじめてのBlender勉強会

2014-02-16 @渋谷

##画面説明
日本語設定
![localize.png](https://qiita-image-store.s3.amazonaws.com/0/20773/b4f9057c-a9c8-e223-4bb7-9f49709af3be.png "localize.png")

フォルダ構成は下記が一般的らしい
![folder.png](https://qiita-image-store.s3.amazonaws.com/0/20773/03ea440f-57f5-6e51-fb3a-7202f021373f.png "folder.png")

###ショートカット
ctrl + up arrow でカーソルのあるウィンドウを全画面表示

* A 全選択／選択解除
* B ドラッグ選択
* C 塗りつぶし選択
* G 移動
* R 回転
* S 拡縮
* N 各数値パネル
* T ツールパネル

レンダラーに渡さないようるにするには、カメラアイコンで切り替え
![outliner.png](https://qiita-image-store.s3.amazonaws.com/0/20773/ef424f24-c46d-4205-ab50-f8323b2cc0b2.png "outliner.png")

カメラをビューにロック Nキーでひらいたパネルのチェックボックス
![camara-view-lock.png](https://qiita-image-store.s3.amazonaws.com/0/20773/ec115bee-f7ae-918f-b1ce-ddbb83b2ae43.png "camara-view-lock.png")

##モデルを編集する
Tabキーで編集モードにする
頂点を右クリック、左クリックで操作
選択方法は3、頂点・線・面（グローバルの右横のボタンでスイッチ）
ショートカットはCtl+Tab
![edit-mode.png](https://qiita-image-store.s3.amazonaws.com/0/20773/7101fb92-4e32-39b4-8036-4fcb0a2a3e69.png "edit-mode.png")

// 3Dカーソルはポインタのある位置を中心に回転とか移動をする

###編集系ショートカット
* X 面とか頂点の削除
* F 線か面でうめる
* E 押し出し
* K ナイフ

###初歩の編集
* ナイフツール
  頂点を選んでいきエンターz
* ポリゴンふやす
  ctrl+r でループカット、ホイールまわすとふやせる
* 二等分ツール
  Aで全選択して、Tの二等分ツールで線をひく、下のパネルで内径削除などする

###ポリゴン操作系ショートカット
* Y 選択面をはがす
* P 選択したオブジェクトを独立させる

###マテリアル
マテリアルはシーンで管理されている
モデルにひもづけるにはプロパティパネルの + で追加、リスト下のマテリアルアイコンから選択する
![materia.png](https://qiita-image-store.s3.amazonaws.com/0/20773/085f119a-e5b2-24ff-2bef-2238e43ecf59.png "materia.png")


###テクスチャをつくる

1. 線を選択 ctrl+e でシームをつける
2. シームをつけたら a で全選択 u で展開

![uv-map.png](https://qiita-image-store.s3.amazonaws.com/0/20773/eecdf90b-1139-c2f6-a7dd-e0fca2afc34d.png "uv-map.png")

展開した画像にカラーグリッドをひく
![color-grid.png](https://qiita-image-store.s3.amazonaws.com/0/20773/317b551d-0b55-ae79-f435-75d90163aa43.png "color-grid.png")

UVをエクスポート
![uv-export.png](https://qiita-image-store.s3.amazonaws.com/0/20773/7ae195be-f39e-a6b2-e48e-2c2b5ded64f9.png "uv-export.png")

###テクスチャをえらぶ
右のパネルからテクスチャタブをひらく
空スロット選択 → 新規 → 画像または動画 → 開く
マッピングの座標をUVに
![map-uv.png](https://qiita-image-store.s3.amazonaws.com/0/20773/ac398afc-ca68-1d46-c292-48b41139bfda.png "map-uv.png")
！マテリアルが設定されてないとこのメニューがでてこない

###ノーマルマップ
ノーマルマップ用の画像を追加する
「マッピング」で、座標をUVにして「影響」でカラーをはずしてノーマルを有効にする
![normal-map.png](https://qiita-image-store.s3.amazonaws.com/0/20773/43a59c1d-06bd-00eb-07d7-38a5edfbd004.png "normal-map.png")


面が割られていればディスプレイスでへこませることが可能
※デフォメーション

##画像出力
プロパティパネルでレンダリングを設定し、F12でレンダリング
ヘッダーメニューの画像メニューで出力
![header-menu-image.png](https://qiita-image-store.s3.amazonaws.com/0/20773/2f975547-d885-e850-a998-9cac74eda859.png "header-menu-image.png")
GASでAdmin SDKを利用する（Directory編）その１

## とりあえず、（ネタとして）前置き
Google Appsの管理者の皆さん、こんにちは。
日々、Appsのユーザ管理や、状況把握について、頭を悩ませているのではないでしょうか。

最近、GASにAdmin SDKのAPIが追加されたようなので、使ってみました。
今回は、Directory APIでユーザリストの取得方法を紹介します。
（少し、ユーザの情報が取れるようなので、活用していただけたらと思っています。）

## 本日のコード
```js:コード.gs
function listAllUsers() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var users = AdminDirectory.Users.list({
    domain: '[your domain]'
  });
  
  if(users) {
    var cells = [];
    cells.push(["fullName", "isAdmin", "isDelegatedAdmin", "isMailboxSetup", "creationTime", "password"]);
    for(var i = 0; i < users.users.length; i++) {
      var rows = [];
      rows.push(users.users[i].name.fullName);
      rows.push(users.users[i].isAdmin);
      rows.push(users.users[i].isDelegatedAdmin);
      rows.push(users.users[i].isMailboxSetup);
      rows.push(users.users[i].creationTime);
      rows.push(users.users[i].password); 
      
      cells.push(rows);
    }
    sheet.getRange("A1:F4").setValues(cells);
  }
}
```

## 実行時に認証が必要です。
### 忘れてはいけない、Apps版コンソールのAPI有効化
これがないと、GASの設定をいくらしても、何もできません…。
![Apps版の設定.png](https://qiita-image-store.s3.amazonaws.com/0/11925/64108f7c-d8dd-b28e-2184-4cff7c9aad8f.png)

### GAS側の拡張サービスをONにする
![DirectoryAPI承認.png](https://qiita-image-store.s3.amazonaws.com/0/11925/27a8a5f8-5743-d9ad-f9da-705f33275583.png)

### Developers Console側でAPIを有効にする。
![CloudConsole認証.png](https://qiita-image-store.s3.amazonaws.com/0/11925/7284e331-3b13-d57d-997a-2662ef7a7822.png)

### 実行時に承認
![実行時承認.png](https://qiita-image-store.s3.amazonaws.com/0/11925/abe75eed-b3a2-234a-1159-37bdebada603.png)

## 解説
今回のコードは、Admin SDKのDirectory APIを実行した結果をSpreadsheetに吐き出しました。
名前（フルネーム）、管理者かどうか、委任管理者かどうか、メールボックスのセットアップ済か、アカウント作成日、パスワード（！？）を取得して表示しています。

GASのドキュメントは、現状では、サンプルコードの提示のみとなっているので、
API本体のドキュメント（https://developers.google.com/admin-sdk/directory/v1/reference/users/list）で確認することになります。

委任管理者というのは、Google Appsの初期値で（？）ユーザ管理者とか、グループ管理者だったりと、制限付きの管理権限が与えられる役割が設定されています。その権限が割り当てられているかどうか。だと思います。
（私の今のApps環境だと全てfalseだったもので…。時間がある時にユーザに設定して確認してみます。）

私の実行環境がApps無料版で、ユーザが3人しかいませんから、上記サンプルで良いですが、ユーザがたくさんいる場合は、APIの制限に引っかかるので、以下のように取得件数の上限と、2ページ目以降を取得するためのTokenを設定して呼び出します。

```js:サンプル.gs
  var users = AdminDirectory.Users.list({
     domain: '[your domain]'
    ,maxResult: [1〜500までで取得件数を指定]
    ,pageToken: [API実行時に取得したToken]
  });
```

具体的なコードは本家のサンプルを参照した方がいいかもしれません。
https://developers.google.com/apps-script/advanced/admin-sdk-directory#list_all_users
grunt-phpでPHPのLivereloadをする方法


##grunt-phpとgrunt-contrib-watchをインストール
※grunt-phpを使う場合はgrunt-contrib-connectは必要ない

```Bash
npm install -D grunt-php@0.2.0 grunt-contrib-watch
```

##ブラウザ拡張をインストール
(cromeの場合）
https://chrome.google.com/webstore/detail/livereload/jnihajbhpnppcggbcgedagnkighmdlei

##Gruntfile.jsの設定
```javascript:Gruntfile.js
'use strict';

module.exports = function (grunt) {

    grunt.initConfig({

        // Built-in PHP-Server
        php: {
            server: {
                options: {
                    //keepalive: true,
					hostname: 'localhost',
                    port: 5000,
                    base: 'app',
                    open: true
                }
            }
        },

        watch: {
            livereload: {
                options: {
                    livereload: true
                },
                files: [
					'app/*.php'
                ]
            }
        },

    });

    grunt.registerTask('server', [
        'php:server',
        'watch'
    ]);
};
```

##ポイント

###v0.2.0以前を使う
最新版であるv0.3.2ではサーバがすぐに終了してしまい上手くいきませんでした。
と思いきやたまーにできたりと不安定。。
なぜか10ページくらい同時にopenすることも。
なおyeomanのgenerator-phpではv0.1.1が使用されています。

###keepaliveは付けちゃだめ
keepaliveを付けるとPHPサーバの起動でタスクの実行が止まってしまうので以後のwatchが実行されません。

###ブラウザのLivereloadボタンを手動でオンにする
サーバが起動してページが開いた初期状態では、Livereloadボタンの真ん中がxのままになっていることがあるので、手動でオンにします。

##ビルトインサーバじゃなくてMAMPとか使いたい
grunt-phpを外してwatchだけにすれば、Livereloadサーバが起動している状態になるので、
MAMPで起動したページを開いてLivereloadボタンをオンにすれば、好きなページをLivereloadできます。

# 参考リンク
http://ngyuki.hatenablog.com/entry/2013/12/03/231619
[Objective-C] クラス拡張と無名カテゴリ


この記事にリンクして、詳細に書いてくれている記事があったので紹介。

[クラス拡張とカテゴリの違いの話。](http://quesera2.hatenablog.jp/entry/2014/02/22/202900)

Objective-Cの内部実装にも触れて分かりやすく書いてくれているので、より どういう違いがあるかが分かるかと思います。

-----------------

AppleのiOS View Controllerプログラミングガイドを読んでいて気づいた。
なんで実装ファイルの方で`@interface`を宣言しているんだろうと思っていたのだけど、これはどうやら **クラス拡張** というものらしい。

似たような仕組みに、 **カテゴリ** がある。
カテゴリは`@interface Hoge(anyCategory)`で宣言するやつ。
これを無名にしている（つまり`@interface Hoge()`）のが、実装ファイルでよく書かれているやつだ。

なるほど、無名カテゴリだから`()`なのか。
と腑に落ちたことをTwitterでつぶやいたら、「いや、厳密には違う」と指摘をもらった。
調べてみたら、どうやら **クラス拡張** という機能で、カテゴリとは厳密には違う仕組みのよう。

参考にした記事から引用させてもらうと、

>
クラス拡張は、無名のカテゴリに似ています。が、別物です。一番の違いは、インスタンス変数を宣言できることと、宣言したメソッドはクラス本体の（＝カテゴリ無しの）@implementationで実装しなければならない点です。

ということらしい。
確かに外部に公開しないメソッドとかを宣言していたなーと気づいた。

つまりまとめると、

1. 実装ファイルに書かれている`@inteface`部は **クラス拡張** の宣言
2. 実装ファイルの`@implementation`は **カテゴリなし** の実装部分のため、クラス拡張の宣言をしっかりと実装しているために問題なし

ということか。

**サンプルコード**

```objc
// Hoge.h
#import <Foundation/Foundation.h>

// 公開メソッド
@interface Hoge : NSObject
- (void)foo;
- (void)bar;
@end
```

```objc
// Hoge.m
#import "Hoge.h"

// クラス拡張
// ヘッダーに公開されないメソッドとインスタンス変数
@interface Hoge () {
	int _count;
}
- (void)method;
@end

@implementation Hoge
- (void)foo { }
- (void)bar { }
- (void)method { }
@end
```

##コメントもらったので追記

よく使われるテクニックとして、ヘッダにreadonlyのプロパティを宣言しておき、外部からは読み取り専用にしつつ、実装側のクラス拡張機能でreadwriteにして読み書きできるようにする、というものがあるみたいです。確かに便利そう！


参考にさせてもらった記事は以下です。

* [Objective-Cのクラス・カテゴリ・クラス拡張の整理](http://shin.hateblo.jp/entry/2013/11/06/171031)
* [カテゴリーとクラスエクステンション](http://www.toyship.org/archives/1464)
Ruby の WEBrick で簡単 HTTP サーバ

Ruby の標準ライブラリ webrick で簡単に HTTP サーバが作れます。

* http://docs.ruby-lang.org/ja/2.1.0/library/webrick.html

```ruby:server.rb
#!/usr/bin/env ruby
 
require 'webrick'
require 'optparse'
 
params = { 
  :DocumentRoot => '.',
  :BindAddress => '0.0.0.0',
  :Port => 4000
}
 
opt = OptionParser.new
opt.on('-d docroot') { |v| params[:DocumentRoot] = v } 
opt.on('-o address') { |v| params[:BindAddress] = v }
opt.on('-p port') { |v| params[:Port] = v.to_i }
begin
  opt.parse(ARGV)
rescue => e
  puts e
  exit 1
end
 
srv = WEBrick::HTTPServer.new(params)
 
trap("INT") do
  srv.shutdown
end
 
srv.start
```

## 使い方

    $ ./server.rb --help
    Usage: server [options]
        -d docroot
        -o address
        -p port
    $ ./server.rb -d /path/to/docroot -o 0.0.0.0 -p 4000

任意のディレクトリ内のファイルを HTTP サーバで公開できます。

## Ruby-1.9.3

Ruby-1.9.3 の場合、WEBrick のログに以下のような警告が出る場合があります。

    WARN  Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true

以下のバグ報告チケットにあるとおり、Keep-Alive 接続時に [HTTPステータスコード](http://ja.wikipedia.org/wiki/HTTP%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89) が 204/304 の場合に発生します。

* https://bugs.ruby-lang.org/issues/5737

同チケットに添付されている `204_304_keep_alive.patch` のパッチを当てて解決します。
仮想環境構築 with Vagrant (Windows)

#仮想サーバ環境
Vagrantを用いて、ローカル上に仮想環境を構築する
Vagrantの簡単な初期設定からChefの導入方法までを説明する。

##事前に必要なソフト
* VirtualBox
* putty(Telnet/SSH クライアント)
* Vagrant
* Cygwin

## 1. 必要ソフト のインストール
 仮想環境構築に必要なVM VirtualBoxをローカルにインストールする。
 注:環境変数にVM VirtualBox のPassを登録しておく。
 Vagrantをインストールしておく

## 2. 仮想環境の前準備
 仮想環境を構築する前に、仮想環境用のOSを入手し、インストールしておく。

### 2.1 BOXを取得する
　仮想環境を構築したいBOXを取得することによって、選択したOSを使用することが可能になる。
　コマンドプロンプト(以下CMD)で、下記のコマンドを実行する。

```text:local
 vagrant box add centos64 http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130427.box
```

実行することで、vargrantにBOX(OSの設定情報みたいなもの)が追加される。今回のコマンドでは、CentOS64bitが手に入る、他のOSが欲しい場合は "vargrant Box" で検索。

注意：プロキシがある場合は、プロキシの設定を先にしておくこと。

### 2.2 BOXの一覧を確認する
 vagrant に 登録されている BOX一覧を確認し、追加したBOXが登録されているかを確認する。
 下記のコマンドを実行することで、vargrantに登録済みのBOX一覧が見える。

```text:local
 vagrant box list
```

## 3. Vagrant で 仮想サーバの初期設定を生成する
 仮想サーバ用のフォルダを作成し、当箇所に移動する。
 仮想サーバの設定を保存する為、以下のコマンドを実行する。

```text:local
vagarant init
```

### 3.1 vagrantfile を編集する
 仮想サーバの設定を変更する為、vagrantfileを編集する。

```text:local
config.vm.box = "***" <- vagrant box list で確認したBOXを記載する
config.vm.network :hostonly, "192.168.50.***" <-適当なIPを追記しておく
```

## 4. Hostを立ち上げる
 仮想環境を立ち上げる。
 ここで、上記の設定を行っておかないと、色々警告メッセージが表示される。

```text:local
vagrant up
```

### 4.1 SSH接続が可能かを確認する
 立ち上げた仮想環境に、ログインできるかの確認をする。
 以後、操作がlocal側と仮想の両方にて、操作が発生する為注意。
 以下のコマンドを実行する。

```text:local
vagrant ssh
```

```text:豆知識:SSHコマンドで、VMに接続する
 vagrant ssh-config --host *** >> ~/.ssh/config //***部分には、サーバ名のようなものを任意でつける
 ssh ***
```

## 5. Server内のSetUp(うぶんつ)
 仮想サーバを起動できるようになったら、仮想サーバのセットアップをしていく。
 既存でインストールされているソフトウェアの更新を行う。

```text:仮想サーバ
sudo apt-get update
```

### 5.1 Gitのインストール
 色々なソフトウェアをインストールする際、
 Gitが入っていると、便利な為インストールする。

```text:仮想サーバ
sudo apt-get install git
```

### 5.2 Rubyを最新版にする
 Chefを入れる為に、RubyのVersionを更新する。

#### 5.2.1 rbenvをインストールする

```text:仮想サーバ
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
```

#### 5.2.2 ruby-buildをインストールする 

```text:仮想サーバ
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

### 5.3 仮想サーバの再起動をする
 設定を反映する為に、一度仮想サーバを再起動する。
 仮想サーバ側の操作とローカル側の操作がある為注意。

```text:仮想サーバ
exit
```

```text:local
vagrant reload
```

### 5.4 RubyのVersionを更新する
 Chefを使用する為に、RubyのVersionを上げる。

```text:仮想サーバ
rbenv list
rbenv install 2.1.2
rbenv global 2.1.2
```

## 6. Chefをインストールする
 Chefをインストールする。

```text:仮想サーバ
gem install chef
```
初めてのPull Requestを送りたいあなたへ

OSS活動をしてみたい、Pull Requestを送ってみたい・・・！

だけどそんな気になるリポジトリもないし（あってもRubyやRailsみたいに敷居が高い）、コントリビューターになれるほどの技術力もそこまで・・・と、そんな状態の人は結構多いんじゃないかと思います。

私自身もそうで今も大して変わりませんが、Pull Requestは送ることがあるという状態になってきたので、こうすればいいんじゃないかということをまとめてみたいと思います。

## 1.Webサービスやアプリを自分で作ってみる
仕事でも趣味でも構いません。まずはWebサービスなりモバイルのアプリなり作ってみるのがいいと思います。
今時は開発していてOSSを一切使わないなんてことはほぼないと思うので、これでまず「身近なOSS」を増やしていきます。

そもそも何をつくったらいいのかわからん、それほど作りたいものもない、ということもあると思います。
そういう時は、以下の方法がお勧めです。

* 他の人に聞く
「どんなアプリがあったら便利かな？」みたいな話をすると結構みんないろいろ言ってくれます。自分に作りたいものが特になければ、誰かにとって便利なものを作ってみるのがいいと思います(私はこれで作りました)。

* 日頃使っているサービスのAPIを使ってみる
GitHubやQiitaはAPIを提供してくれています。自分が普段使っているアプリの情報を抽出して何かできないか考えてみるとアイデアが出てくるかもしれません。

* コンテストのサイトを見る
[Cookpadのコンテスト](https://info.cookpad.com/24contest)や[Mash up Award](http://ma9.mashupaward.jp/)のサイトを見てみると、テーマや応募作品などが見られます。これをヒントにすると作りやすいんじゃないかと思います。
特にMasu up Awardは[APIの一覧](http://ma9.mashupaward.jp/apis)があるので、これは結構ヒントになります。

くだらないことでもいいので、思いついたらとにかくメモっておいた方がいいです。いざ作ろうと思って机の前に向かうとアイデアがなかなか出てきません。

## 2.issueを作る・見る
OSSを使っていると、バグを発見したり「ここ、こうできないのかな？」みたいなことが出てきます。

普通にみんな使っているOSSなのでバグを発見することは稀ですが、JavaScript系のライブラリはIEで動かすと結構バグが出てきてそれがとっかかりになりやすいです(幸か不幸か・・・)。私が初めてissue、Pull Requestを出したのも使っているライブラリのIE6のバグでした。jQueryのプラグインなどはコード量もそれほど多くないものが多く、とっつきやすいと思います。
自分で作る場合は理想的な環境で作ると思うので、バグについては仕事での方が発見する機会が多いかもしれません。

それでGitHubなどのリポジトリのissueを見てみると、自分と同じ現象で悩んでいたりあるいは「これなら自分でも解決できそうだな」というissueがあったりします。あんまり大きいリポジトリよりは、小～中のプラグイン的なポジションのものの方が見つけやすいと思います。

発見したバグのissueをあげる、もしくは解決できそうなissueを見つけたら、Pull Requestはもう目の前です。
※issueをあげる際は、ルールがある場合があるのでそこのところはきちんと確認。例えば、私がお世話になっているSlickGridというライブラリでは、[issueはバグ報告のみに限定](https://github.com/mleibman/SlickGrid/wiki/Rules-of-conduct)されています。

## 3.Pull Requestを送る
ここから先の手順はいろいろなところにまとめられているので([こちらなど](http://kik.xii.jp/archives/179))、そこを参考にすればよいと思います。
基本的には、以下原則を外していなければそう身構えなくてもよいと思います。

* masterで作業しない  
issueがすでにあるので、`issue10`みたいなissue番号がわかるブランチで作業すればよいと思います。他の人のPull Requestを見て参考にすると良い。
* ルールを確認する  
Pull Requestを送る際はこうしてくれ、というルールがままあります(例：[jQueryの場合](https://contribute.jquery.org/commits-and-pull-requests/))。それをきっちり確認しましょう。
* 送る前に差分を確認する  
特に注意すべきなのが、エンコードやインデントです。タブと空白の違いで差分が異常に出ていたりしたらNGですし、forやifのインデント、細かいですが`a=b`なのか`a = b`なのか、みたいなものも他ときちんと合わせておくことが重要です。
また、差分はPull Requestを送る直前の状態と比較してとらないと意味がありません。[upstream](http://qiita.com/xtetsuji/items/555a1ef19ed21ee42873)でmasterをきっちり最新に合わせておきましょう。

issueからのPull Requestだと、#10の修正です、みたいな感じで送る際の文面も書きやすいです。
英語も含めた最後のチェックをして、Pull Requestを送ったらそれがOSS活動の第一歩です！

しばらくコメントがついてないか何回も確認したりしてドキドキしますが、マージされることを祈り気長に待ちましょう。リポジトリによると思いますが、当然OSS活動が本業という人は少ないので、すぐにリアクションがあることは稀です。

また、Pull Requestを送らないまでも情報が足りていないと思えばWikiに追記したり記事を書いたり、バグのissueで「私の環境ではxxだった」と情報を追加するなど、できることは色々とあります。

もしこの記事を読んでPull Requestを初めて送った方がいたら、これほどうれしいことはないです。
よきOSSライフを！
davecheney/profileを利用しGoアプリケーションの性能を測る（プロフィール）


プロセスのCPU、メモリなどの使用状況を調べる時プロファイーリングをしたいですが、標準の"runtime/pprof"
を使うのがちょっとややこしいです。

[davecheney/profile](https://github.com/davecheney/profile)を発見。

##1.導入

`go get github.com/davecheney/profile`

##2.ソースに組み込み

下記のように簡単に使えますが：

```go
import "github.com/davecheney/profile"

func main() {
        defer profile.Start(profile.CPUProfile).Stop()
        ...
}
```

だが、メモリとCPU両方をプロファイルし、pprofファイルを同じのフォルダに格納したいですので、こうかきます：

```go
  cfg := profile.Config {
          MemProfile: true,
          CPUProfile: true,
          ProfilePath: ".",
  }

  // Stopを忘れないように
  defer profile.Start(&cfg).Stop()
```

##3.Build

ここでchain.goを例にします。

`go build chain.go`

##4.実行

`./chain `

下記のようにメッセージが出されます。

>2014/02/22 11:43:40 profile: cpu profiling enabled, cpu.pprof
2014/02/22 11:43:40 profile: memory profiling enabled, mem.pprof

ファイルの生成が確認できます。

>liubin:Documents liubin$ ls -tl | grep pprof
-rw-r--r--   1 liubin  staff     2952  2 22 11:44 cpu.pprof
-rw-r--r--   1 liubin  staff      585  2 22 11:44 mem.pprof

##5.結果を確認
 `go tool pprof`　を利用し結果が表示出来ます。

>liubin:Documents liubin$ go tool pprof --text chain mem.pprof 
Adjusting heap profiles for 1-in-4096 sampling rate
Total: 189.4 MB
   142.1  75.0%  75.0%    142.1  75.0% runtime.malg
    47.2  24.9% 100.0%    189.3 100.0% main.main
     0.1   0.0% 100.0%      0.1   0.0% runtime.allocm
     0.0   0.0% 100.0%      0.0   0.0% github.com/davecheney/profile.func·004
     0.0   0.0% 100.0%      0.1   0.0% newm
     0.0   0.0% 100.0%      0.0   0.0% os/signal.Notify
     0.0   0.0% 100.0%      0.0   0.0% resetspinning
     0.0   0.0% 100.0%      0.0   0.0% runtime.gc
     0.0   0.0% 100.0%    189.3 100.0% runtime.gosched0
     0.0   0.0% 100.0%    189.3 100.0% runtime.main
     0.0   0.0% 100.0%      0.0   0.0% runtime.mstart
     0.0   0.0% 100.0%    142.1  75.0% runtime.newproc
     0.0   0.0% 100.0%    142.1  75.0% runtime.newproc1
     0.0   0.0% 100.0%      0.0   0.0% runtime.starttheworld
     0.0   0.0% 100.0%      0.0   0.0% schedule
     0.0   0.0% 100.0%      0.0   0.0% startm
     0.0   0.0% 100.0%      0.0   0.0% wakep
tmux内のvimで「E353: Nothing in register *」と出てコピーペーストができなくなった


[MacのVimでHomebrewを使ってクリップボード連携を有効にする](http://qiita.com/shoma2da/items/92ea8badcd4655b6106c)の続きです。

前回の設定でVimからクリップボードが使えるようになりましたがtmuxを立ち上げてからコピーペーストしようとすると`E353: Nothing in register *`が出るようになってしまいました。

以下の手順で解決できます。

```Bash
$ brew install reattach-to-user-namespace

$ echo 'set-option -g default-command "reattach-to-user-namespace -l bash"' >> ~/.tmux.conf
```

これだけです。
`tmux kill-server`などして再度立ち上げると問題なくコピーペーストできるようになります。