OmniAICreator/Qiita-1.07M huggingface dataset:
1画面につき1StoryBoardファイルを実現する


# 概要
Xcode6ですと、StoryBoardを使用するのが標準です。 現状(Xcode6.4)では、1つのStoryBoardファイルで全ての画面を管理します。 StoryBoardが1つですと、ソース管理でコンフリクトを起こしやすいですし、できれば1画面につき1StoryBoardファイルで開発したいところです。 そこで、この記事では1画面につき1StoryBoardファイルを実現する方法を提示します。 

# プロジェクトの設定
プロジェクトの設定のInfoで「Main storyboard file base name」を選択してマイナスボタンで削除します。 Main.storyboardファイルはプロジェクトから削除します(残しても問題ないですが)。 
![1.png](https://qiita-image-store.s3.amazonaws.com/0/2911/00c286b2-af02-3d0d-3724-7690c4146c1f.png "1.png")


# 画面を構成するファイル

## ファイルの追加
画面のために以下の二つのファイルを追加します。 分かり易くするため、この2つのファイル名は同じにします(ここではSubViewController.*)。 

*   Story Boardファイル
*   サブクラスがUIViewControllerのCocoa Touch Classファイル

さらに、SubViewController.stroyboardを開き、View Controllerを追加しておきます。 

## Stroy BoardのView Controllerの設定

### Custum Classの設定
追加したView ControllerのプロパティでCustom ClassのClassに上記追加したCocoa Touch Classのクラス(SubViewController)を指定します。 
![2.png](https://qiita-image-store.s3.amazonaws.com/0/2911/f0a0e080-b0b2-d3ef-cbff-6a8b045c4f1e.png "2.png")

### Initial View Controllerの設定
追加したView ControllerのプロパティでView Controllerのis Initial View Controllerチェックボックスにチェックを入れます。 
![3.png](https://qiita-image-store.s3.amazonaws.com/0/2911/4fc7f3d8-bd84-8209-3c81-33cd4547dfd6.png "3.png")


# 初期画面の表示
AppDelegate.swiftファイルを以下の通り修正します。 

*   navigationControllerプロパティを追加
*   `application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool`を修正

`UIStoryboard`イニシャライザのname:には初期画面にしたい画面を含むStory Boardの名称を指定します。 

```swift
    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {
    
        var window: UIWindow?
        var navigationController: UINavigationController?
    
        func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
            var storyboard: UIStoryboard = UIStoryboard(name: "SubViewController", bundle: NSBundle.mainBundle())
            var mainViewController: UIViewController = storyboard.instantiateInitialViewController() as! UIViewController
    
            self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
            self.navigationController = UINavigationController(rootViewController: mainViewController)
    
            self.window?.rootViewController = navigationController
            self.window?.makeKeyAndVisible()
    
            return true
        }
        ・・・
    }
```

# 画面遷移

## 次の画面へ
画面遷移を行う場合は、以下の様に

`UIStoryboard`イニシャライザのname:に次画面を含むStory Boardの名称を指定します。

```swift
    var storyboard: UIStoryboard = UIStoryboard(name: "NextViewController", bundle: NSBundle.mainBundle())
    var secondViewController: SecondViewController = storyboard.instantiateInitialViewController() as SecondViewController
    
    self.navigationController?.pushViewController(secondViewController, animated: true)
```

## 前の画面へ

```swift
self.navigationController?.popViewControllerAnimated(true)
```
ネストしたデータ構造を操作するput_inとupdate_inが便利

Elixirのネストしたデータ構造を操作するビルトイン関数に`put_in`, `update_in`があります。

## put_in
put_in(path, value)でネストしたデータ構造のプロパティを変更して新しい構造を返します。
注意する点は、Elixirの変数はimmutableなので、もとの変数のプロパティは変更されません。

```iex
iex> foo = %{person: %{name: "foo", age: 21}, place: "Shibuya"}
iex> put_in(foo.person.age, 30)
 %{person: %{age: 30, name: "foo"}, place: "Shibuya"}
iex> foo
%{person: %{age: 21, name: "foo"}, place: "Shibuya"}
```

## update_in
`update_in`は`put_in`の第二引数として関数を受け取ります。

```iex
iex> foo = %{person: %{name: "foo", age: 21}, place: "Shibuya"}
iex> update_in(foo.person.age, fn age -> age + 1 end)
%{person: %{age: 22, name: "foo"}, place: "Shibuya"}
```

マップだけでなく、構造体にも適用することができます。

```elixir
defmodule User do
  defstruct name: nil, text: nil, place: nil
end

defmodule Message do
  defstruct user: nil, text: nil, place: nil
end

message = %Message{user: %User{name: "foo", age: 21}, text "Yay!", place: "Shibuya"}
update_in(message.user.age, &(&1 + 1))
// => %Message{place: "Shibuya", text: "Yay!", user: %User{age: 22, name: "foo"}}
```
c++ builder XE4, 10.2 Tokyo > 異なるFormXXXのComponentCountを取得する関数の引数 > TForm *

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/26)
```

Form1, Form2, Form3に対して、ComponentCountを取得する処理。

```cpp
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	CountComponent(Form1);
	CountComponent(Form2);
	CountComponent(Form3);
}

void __fastcall TForm1::CountComponent(TForm *Sender)
{
	int num = Sender->ComponentCount;
	int nop = 1;

}
```

TForm *で引数とするので良さそう。

これで、複数のフォームに対する共通処理が実装できるかと思う。

<hr>
別途、TForm *をTComponent *とするのでもいけた。違いについては未勉強であるが、TFormのヘルプを見ると

```
TObject -> TPersistent -> TComponent -> TFmxObject -> TCommonCustomForm -> TCustomForm -> TForm
```
というようになっている。
Cloud9にssh接続 (Reverse SSH Tunneling)

* [Linux - sshポートフォワーディング - Qiita](http://qiita.com/tukiyo3/items/235e19ae24b68c59e540#1-2)リバースSSHトンネリングで接続ができたが、.ssh が読み取り専用だったのでひと手間必要だった。
* cloud9はGCEで動いているようですね。

## 始め方

* https://c9.io にアクセスし `SIGN UP`。自分はGitHub連携をした。

![Screenshot from 2015-07-30 08:14:49.png](https://qiita-image-store.s3.amazonaws.com/0/25728/30d9f363-f2b8-2cc1-9427-1d303de1104d.png)

* Demo Project -> Open Project

![Screenshot from 2015-07-30 08:20:46.png](https://qiita-image-store.s3.amazonaws.com/0/25728/cd1073d6-e271-eb84-58f1-b32e2a2f3928.png)

エディタ領域が出てきた。
このエディタは優秀ではあるが`ctrl`を用いたショートカットキーがブラウザに喰われてイラッとするのでsshすることにした。

# ssh接続手順

## cloud9側の準備

```bash:
mv ~/.ssh ~/.ssh.bak
cp -a ~/.ssh.bak ~/.ssh
```

* ~/.ssh/authorized_keys に接続を許可する鍵を追記。
 

## 接続したい端末の ~/.ssh/authorized_keys に追記

* ~/.ssh/authorized_keys にcloud9の.ssh/id_rsa.pubの内容を追記

```bash:~/.ssh/authorized_keys
command="/bin/false",no-pty,no-X11-forwarding,no-agent-forwarding ssh-rsa AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA cloud9
```

* port-forwardingしてほしいため、`no-port-forwarding`は設定してはいけない。

## cloud9から接続したい端末にport-forward

```bash:
ssh -N -R 2222:localhost:22 User1@myserver.co.jp -p 22
```

* 自分のサーバ: myserver.co.jp
* ユーザ名: User1
* Port: 22
* Cloud9
    * ssh(dropbear)サーバ: port 22
    * myserver.co.jpのlocalhost:2222 にport-forward

## ssh接続

```bash:
ssh ubuntu@localhost -p 2222
```

* ~/.ssh/id_rsa のパスワードを入力し接続成功することを確認。
ace-jump-modeでリージョン範囲を広げるためには

ace-jump-modeでリージョン範囲を広げることを考える。つまり、`C-SPC`でマークをセットしてリージョンをアクティブにし、その後いくらかカーソルを移動すればリージョン範囲が広がることが確認できるが、ace-jump-modeでさらにその範囲を広げてみよう、ということである。これを実際にトライしてみるとすぐに分かるように、最新版ではace-jump-mode発動時のカーソル位置に常にマークをプッシュしてしまうため、リージョン範囲が期待した通りに広がらない。
（ただし`ace-jump-mode`を適切なキーに設定している状況を想定。例えば`C-c C-SPC`）

そこで以下のように関数を修正した。

```el:
(defun ace-jump-push-mark ()
  "Push the current position information onto the `ace-jump-mode-mark-ring'."
  ;; add mark to the emacs basic push mark

  ;; リージョンがアクティブのときはマークをプッシュしないように修正
  (unless (region-active-p)
    (push-mark (point) t))
  ;; 修正ここまで

  ;; we also push the mark on the `ace-jump-mode-mark-ring', which has
  ;; more information for better jump back
  (let ((pos (make-aj-position :offset (point)
                               :visual-area (make-aj-visual-area :buffer (current-buffer)
                                                                 :window (selected-window)
                                                                 :frame  (selected-frame)))))
    (setq ace-jump-mode-mark-ring (cons pos ace-jump-mode-mark-ring)))
  (if (> (length ace-jump-mode-mark-ring) ace-jump-mode-mark-ring-max)
      (setcdr (nthcdr (1- ace-jump-mode-mark-ring-max) ace-jump-mode-mark-ring) nil)))
```
リージョンがアクティブのときはマークをプッシュしない、というものである。上記関数を評価した後は期待通りにリージョン範囲を広げることができる。

余談だが、最近「[画面内を素早くカーソル移動する方法のまとめ](http://qiita.com/ballforest/items/834c92bf5bf262c37973)」で紹介したavyでもリージョンがアクティブ時の同様の問題点が指摘され、修正されている。むしろ本稿はこの修正に触発されて書いた。
[avy.el (avy-action-goto): Don't push mark when region is active](https://github.com/abo-abo/avy/commit/30067ddc09eefddae4ece065f60cc52a55ed76d7)
メソッドのアクセスを制限



メソッドには処理が書かれていなければならない。書いてないのは文法的にout
publicメソッド クラスの内部、外部から呼び出せるメソッド
privateメソッド　クラスの内部からしか呼び出せないメソッド


```
   class Car 
     def run
       set_fuel
     end
     
     private
     
     def set_fuel
       puts "燃料を減らします"  
     end
   end 
   
   car1 = Car.new  
   car1.set_fuel  #privateメソッドからは呼び出せない
   
   car1.run　　#runメソッドからは呼び出せる。   
```


メソッドを定義してから、呼び出すの一連の動作の確認


```
class Car 
  attr_reader :x, :fuel 

  def initialize 
    @x = 0
    @fuel = 100
  end

  def run(distance) 
    @x += distance
    
    set_fuel(@fuel - distance)
  end 
  
  private
  
  def set_fuel(litre)
    @fuel = litre
  end
end


my_car = Car.new


puts "何km走りますか？"
distance = gets.chomp.to_i 

my_car.run(distance) #5


puts "走行距離: #{my_car.x}km"
puts "ガソリン量: #{my_car.fuel}リットル"
```

・attr_readerにfuel(燃料)のゲッターを定義
・initializeメソッドに@fuel = 100を代入しインスタンス生成時に燃料を100にする.
　これでインスタンス生成時に@x = x(最初の走行距離が0)と@fuel = 100が呼び出される。
・private宣言下に、set_fuel(litre)メソッドを定義し、@fuelにlitreを代入する。
・runメソッドにset_fuelメソッドで呼び出し、(@fuel - distance)を定義
・newコマンドでインスタンスを生成する。(initializeメソッドが呼ばれる)
・my_car.fuel(ゲッターメソッド)を定義する。
ユーザーが入力をした時に、initializeメソッド、runメソッドが呼び出され、(燃料100-入力された値)が実行される。


>注意　
set_fuelメソッドに@fuelのように単独でインスタンス変数が存在することはない。
なぜなら、何も処理を記述していないメソッドはrubyの文法としてあり得ない

>例
def ponpoko

>end
のようにメソッドの内部処理を定義していないのでエラーになる。

>def ponpoko
endなら良い

参照
https://programmer-engine.work/archives/24
Windows 10 Technical Preview の有効期限


そのうち起動しなくなるようなので、必要なファイルがあれば退避しておく必要がありますね。

| ビルド番号 | 有効期限の警告開始 | ライセンスの有効期限 | Windows の起動停止 |
|------------|--------------------|----------------------|--------------------|
|       9841 | 2015/4/2           | 2015/4/15            | 2015/4/30          |
|       9860 | 2015/4/2           | 2015/4/15            | 2015/4/30          |
|       9879 | 2015/4/2           | 2015/4/15            | 2015/4/30          |
|       9926 | 2015/9/17          | 2015/10/1            | 2015/10/15         |
|      10041 | 2015/9/17          | 2015/10/1            | 2015/10/15         |
|      10049 | 2015/9/17          | 2015/10/1            | 2015/10/15         |

元記事はここ
[Windows 10 Technical Preview の有効期限について - マイクロソフト コミュニティ](http://answers.microsoft.com/ja-jp/insider/forum/insider_wintp-insider_install/windows-10-technical-preview/86173780-0ffc-4d68-b827-f041e29a2927?auth=1)
csharp > Conditional attribute

UnityのTutorialなどでConditionalというキーワードを見かけた。

C#の機能らしい。

https://msdn.microsoft.com/en-us/library/4xssyw96(v=vs.90).aspx

```csharp
#define TRACE_ON
using System;
using System.Diagnostics;

public class Trace
{
    [Conditional("TRACE_ON")]
    public static void Msg(string msg)
    {
        Console.WriteLine(msg);
    }
}

public class ProgramClass
{
    static void Main()
    {
        Trace.Msg("Now in Main...");
        Console.WriteLine("Done.");
    }
}
```

TRACE_ONの#defineをコメントアウトするとTrace.Msg()が実行されなくなる。

上記のmicrosoftのリンクでは
> Using Conditional is a cleaner, more elegant, and less error-prone alternative to enclosing methods inside <font color=red?#if and #endif</font>, 

ただ、複数の条件をANDで使うときは、下記のようにコードが冗長になるような気がする。

```csharp
[Conditional("A")]
static void DoIfA()
{
    DoIfAandB();
}

[Conditional("B")]
static void DoIfAandB()
{
    // Code to execute when both A and B are defined...
}
```
これは#if defined()を使う方がいいかも。
gitwach > _MSC_VER > Visual Studio

https://github.com/Itseez/opencv/blob/b46719b0931b256ab68d5f833b8fadd83737ddd1/modules/core/include/opencv2/core/cvdef.h
を見ていてふと目に入った部分。

```
#if !defined _CRT_SECURE_NO_DEPRECATE && defined _MSC_VER && _MSC_VER > 1300
#  define _CRT_SECURE_NO_DEPRECATE /* to avoid multiple Visual Studio warnings */
#endif
```

_MSC_VERとは?
コメントにあるようにVisual Studioに関係するようだ。

こちらが参考になる。
http://mwlab.net/2010/08/directive.html
> \#if _MSC_VER >=1300 // VC2002(VC7.0)以降
c++11 > ラムダ式によるループの一般化

引用: ゲームプログラマのためのコーディング技術 by 大圖衛玄(Moriharu Ohzu)さん

```cpp:使用前
for(int y = 0; y < HEIGHT; ++y) {
  for(int x = 0; x < WIDTH; ++x) {
    block[y][x].update(deltaTime);
  }
}
for(int y = 0; y < HEIGHT; ++y) {
  for(int x = 0; x < WIDTH; ++x) {
    block[y][x].draw();
  }
}
```

each()という関数を用意する。

```cpp:each関数
template <typename F> // Fがラムダ式や関数ポインタになる
void each(F action)
  for(int y = 0; y < HEIGHT; ++y) {
    for(int x = 0; x < WIDTH; ++x) {
       action(block[y][x]);
    }
  }
}
```

```cpp:eachの使用
each([&](Block& block) {block.update(deltaTime);});
each([](Block& block) {block.draw();});
```

update()とdraw()の部分がずいぶんスッキリした。
技術英語 > momentary lapse of memory

> momentary lapse of memory

「度忘れした」の意味。

Star trek Voyagerにてドクターが言っていた。

どういう場面だったか「度忘れ」した。

確か、ホログラムのドクターとそのモデルとなった博士とのやり取りがあるエピソードだったような。
CLEditorの設置、カスタマイズ

## 準備

* [CLEditor](http://premiumsoftware.net/cleditor/downloads)
    * Table Plug-in Version 1.0.4 もダウンロードしておく。
* [jquery](http://code.jquery.com/)

## 出来上がるもの

![Screenshot from 2015-07-30 05:56:42.png](https://qiita-image-store.s3.amazonaws.com/0/25728/61d2c319-0641-d959-317f-6b720bf350a6.png)

![Screenshot from 2015-07-30 05:56:51.png](https://qiita-image-store.s3.amazonaws.com/0/25728/2f6f2c41-1001-b86e-7cc4-94ae97b0e6eb.png)

## ソース

```html:index.html
<html>
<head>
    <meta charset="utf-8" />
    <link rel="stylesheet" href="jquery.cleditor.css" />
    <script src="jquery.min.js"></script>
    <script src="jquery.cleditor.min.js"></script>
    <script src="jquery.cleditor.table.min.js"></script>
    <script>
$(document).ready(function () {

//ツールバー日本語化
$.cleditor.buttons.source.title = 'ソース表示';
$.cleditor.buttons.bold.title = '太字';
$.cleditor.buttons.italic.title = '斜体';
$.cleditor.buttons.underline.title = '下線';
$.cleditor.buttons.size.title = 'フォントサイズ';
$.cleditor.buttons.color.title = 'フォント色';
$.cleditor.buttons.rule.title = '水平線(hrタグ)';
$.cleditor.buttons.image.title = '画像urlの挿入(imgタグ)';
$.cleditor.buttons.highlight.title = 'ハイライト';
$.cleditor.buttons.removeformat.title = '書式の削除';
$.cleditor.buttons.source.title = 'ソースの確認';
$.cleditor.buttons.link.title = 'リンク(aタグ)';
$.cleditor.buttons.unlink.title = 'リンク削除(aタグ)';
$.cleditor.buttons.table.title = 'テーブル挿入(tableタグ)';

//テーブルの画像PATH修正
$.cleditor.buttons.table.image = "../images/table.gif";
//テーブルのボタン押した時の表示日本語化
$.cleditor.buttons.table.popupContent = "" +
    '横:<input type="text" value="7" maxlength="1" style="width:20px">' +
    '縦:<input type="text" value="3" maxlength="1" style="width:20px">' +
    '<br /><input type="button" value="決定">',

$("#input").cleditor({
        width: 300, //入力枠の横幅
        height: 550, //入力枠の縦幅
        sizes: "4,5,6,7", //文字サイズ。4が標準、なのか
        // 文字色を<span style="">で指定するのではなく、<font color="">で指定
        useCSS: false,
        // ツールバーで使いたい機能一覧を指定
        controls: "source | bold italic underline | " +
        "size color highlight removeformat " +
        "alignleft center alignright | " +
        "undo redo | rule image link unlink | table",
        bodyStyle:"" //文字サイズが小さかったので初期化
});
});
    </script>
</head>
<body>
    <textarea id="input" name="input"></textarea>
</body>
</html>
```
UI Router使用時のAngularJSでのGoogleAnalytics設定方法


generator-angular-fullstackを使ってる方なら分かると思いますが、angular-fullstackではUI Routerがデフォルトで使われています。
で、その場合GoogleAnalyticsにちょっとした設定方法が必要になってきます。
それに気付くまで結構かかったので失敗例と成功例とを説明していきます。

## 失敗例

まず、普通にトラッキングコードを使って以下の様にやってみました。

````index.html
// ~適当なところに~
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-hoge', 'auto');
  ga('send', 'pageview');

</script>
````

やってみたところ勿論ダメ。

次に[angulartics](https://github.com/luisfarzati/angulartics)と[angulartics-google-analytics](https://github.com/angulartics/angulartics-google-analytics)を使ってみました。

````index.html
// ~適当なところに~
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-hoge', 'auto');
</script>
````

````app.js
// 色々必要のないところは省いてます
'use strict';

angular.module('lgtmGeneratorApp', [
  'angulartics',
  'angulartics.google.analytics'
])
  .run(function($rootScope, $window, $location){
    $rootScope.$on('$stateChangeSuccess', function(event){
      $window.ga('send', 'pageview', { page: $location.path() });
    }); 
  });
````

こんな感じでapp.jsで呼び出してもダメでした・・・

## 成功例

そんなところ、何故か以下のコードで「トラッキングがインストールされています」状態になりました。

````index.html
// ~適当なところに~
<script type="text/javascript">
 var _gaq = _gaq || [];
 _gaq.push(['_setAccount', 'UA-XXXXX-X']);
 _gaq.push(['_trackPageview']);
 _gaq.push(['_trackPageLoadTime']);

 (function() {
   var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
   ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
   var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
 })();
</script>
````

で、勿論ですがapp.jsも変更しなきゃというわけで以下の様に変更。

````app.js
// 色々必要のないところは省いてます
'use strict';

angular.module('lgtmGeneratorApp', [
  'angulartics',
  'angulartics.google.analytics'
])
  .run(function($rootScope, $window, $location){
    $rootScope.$on('$stateChangeSuccess', function(event){
      $window._gaq.push(['_trackPageview', $location.path()]);
    }); 
  });
````

すると無事アクセスを取得することができました！
NumPyでfor文を使うと遅いと思ったがそんな事はなかったぜ


Inspired by [numpyで明示的にループを書くと極端に遅くなる](http://qiita.com/nonbiri15/items/ef97b84832055ab807fb)

上述の記事では明示的にforを書くと極端に遅くなるという話でした。
例えば

```py3
def matmul1(a, b):
    lenI = a.shape[0]
    lenJ = a.shape[1]
    lenK = b.shape[1]
    c = np.zeros((lenI, lenJ))
    for i in range(lenI):
        for j in range(lenJ):
            for k in range(lenK):
                c[i, j] += a[i, k] * b[k, j]
    return c
```

のようなコードは`np.dot`と比べて遅くなります。

```py3
%timeit matmul1(a, b)
1 loops, best of 3: 12.9 s per loop
```

```py3
%timeit np.dot(a, b)
10 loops, best of 3: 20.7 ms per loop
```

手元のノートPCで計算しているので遅いです。またatlas/mklはリンクしてません。

ここで[Numba](https://numba.pydata.org/)を使います。

```py3
import numba

@numba.jit  # ここだけ追加
def matmul1_jit(a, b):
    lenI = a.shape[0]
    lenJ = a.shape[1]
    lenK = b.shape[1]
    c = np.zeros((lenI, lenJ))
    for i in range(lenI):
        for j in range(lenJ):
            for k in range(lenK):
                c[i, j] += a[i, k] * b[k, j]
    return c
```

これはPythonのコードをLLVMを使ってJITコンパイルするため、非常に高速に実行できます。
初回の呼び出しはコンパイルする時間が含まれるので、それ以降の呼び出しで速度を計測すると：

```
%timeit matmul1_jit(a, b)
10 loops, best of 3: 24.4 ms per loop
```

このように１行追加するだけで`np.dot`より同程度（２割遅いくらい）になりました。

全体の[ipynb](http://nbviewer.ipython.org/gist/termoshtt/824ff3e766de5fe9fdd6)を[gist](https://gist.github.com/termoshtt/824ff3e766de5fe9fdd6)においておきます。
Qiitaでnbviewer埋め込めればいいのに。
Motion, TextObject, Operator とは何なのか？

# 前置き

Atom で自分の Package 以外に最も気にして PR を投げたりしているのは [vim-mode](https://github.com/atom/vim-mode) なのですが、色々と事を進めるにあたり、リファクタリングの必要も感じています(自分ができるかどうかはおいといて)。
今回、表題の件について自分なりに考え、vim-mode の issue に記録として書いておきました。

[[NOTE] What is Motion, TextObject, Operator](https://github.com/atom/vim-mode/issues/800)

以下は、その翻訳です。私はそれほど英語は得意ではないですが、英語でまず最初に書いて、日本語に訳すという流れになっている。
翻訳をする理由は２つあり、ひとつは自分の理解をさらに確かめ、深める為と、もうひとつは、日本人からのフィードバックを期待しているからです。

# Motion, TextObject, Operator とは何なのか？

このノートは、Vim の主要な概念である Motion, TextObject, Operator についてまとめたものである。
今後のリファクタリングや、TextObject, Motion, Operator オブジェクトをサービスAPIで公開する際に役に立てば嬉しい。

# TextObject と Motion

両方共とても似ている。概念も実装も。

- Motion も TextObject も end(ターゲット位置)ポジションを持つ.
- TextObject は start ポジションを要求する。Motion はしない。言い換えれば、Motion の start ポジションは常に現在のカーソル位置になる。
- 全ての TextObject は Motion のスーパーセットである。
- よって、全ての TextObject は Motion としても使用可能。逆は出来ない。  
 e.g. TextObject for function は、function body(=TextObject) を yank, delete するのに使える。また、次や、前の function 位置に移動(=Motion)するのにも使える。
- Motion も TextObject も Operator のターゲット(=対象)として使える。

# Operator
- Operator はアクションである。アクションはターゲットを要求する。
- ターゲットは、通常 Motion か TextObject である、概念的には、範囲を返す全てのオブジェクトはターゲットになることが出来る。

# Visual mode

Visual mode は特別である。暗黙的な Operator と、TextObject を持っているという点において。

- 本質的には、visual-mode は modal エディタである Vim のモードの一つである。
- Visual-mode で Operator コマンドが実行(invoke)されると、暗黙的な "TextObject for selection" が Operator のターゲットとして使われる。
- Visual-mode で `i`(inside) や `a`(a or around)を使って、TextObject コマンドが実行(invoke)されると、暗黙的な "select Operator" が Operator として使用される。
- TextObject for selection は現在の visual area(選択範囲)を返す。
- Select Operator は visual area(選択範囲) を TextObject が返した範囲に拡張する。


# コンセプト実装

上記の概念を CoffeeScript で実装したもの。

```coffeescript
class Motion
  constructor: (@editor) ->

  getStartPoint: ->
    @editor.getCursorBufferPosition()

  getEndPoint: ->
    throw "Motion must implement `getEndPoint()`"

  getRange: ->
    new Range(@getStartPoint(), @getEndPoint())

  execute: ->
    @editor.setCursorBufferPosition(@getEndPoint())

class TextObject extends Motion
  getStartPoint: ->
    throw "TextObject must implement `getStartPoint()`"

class Operator
  constructor: (@editor) ->

  operate: (range) ->
    throw "Operator must implement `operate(range)`"

  # target is Motion or TextObject, but all object can be target as long as
  # its respond to getRange().
  execute: (target) ->
    @operate target.getRange()

# Visual mode's implict TextObject and Operator
class TextObjectSelection extends TextObject
  getRange: ->
    @editor.getSelectedBufferRange()

class OperatorSelect extends Operator
  operate: (range) ->
    @editor.setSelectedBufferRange range
```
高機能CAMソフト Estlcam 導入編

*※この記事は昔自分が書いた記事をほとんどそのまま持ってきたものです。*

#はじめに
![image](https://qiita-image-store.s3.amazonaws.com/0/20914/5e359b9f-435c-ed32-5a04-277db7666190.png)


CNCフライスを動かすにはGコードが必要になります。

CADソフトやIllustratorで出力したDXFからGコードに変換できればすごく使い勝手がいいのでフリーで使えるソフトを探してみました。

DXFからGコードに変換できるフリーソフトだとG-Simple(CAD/CAMソフト)とかが有名だと思うんですが、いまいち使いづらかったり操作方法がわからないとかで悪戦苦闘してたんですよね。

自分なりにいろいろ調べてEstlcamってフリーのソフトが一番しっくりきたので使い方とか含めてここで紹介していこうと思います。

#Estlcamとは
![image](https://qiita-image-store.s3.amazonaws.com/0/20914/2b1b7646-3552-5619-5633-ef01058f1c04.png)

Estlcamとはドイツ製の高機能CAMソフト

Windows8からXPまで対応しています。

無料ですべての機能が使用できるみたいですが、無料版の制限の内容がドイツ語なのでちょっとわからないです…。今のところは問題なく使えています。

読み込み対応形式は

DXF,E25,STL,NC,JPG,PNG,GIF,PLT

とCAD図面だけじゃなくて画像にも対応してます。

ArduinoのCNCコントローラ機能もあるみたいなのでCNCフライスを自作してみたい方には朗報かもしれません。

#インストール

まずは公式サイトに行き青文字のDownload Version …..をクリックしてインストーラをダウンロード。

![image](https://qiita-image-store.s3.amazonaws.com/0/20914/7720dd33-5f47-a3d1-2b6b-f63ddcf53a1b.png)

ダウンロードしたインストーラを起動し、規約に同意(I Agree)して進めていきます。

![image](https://qiita-image-store.s3.amazonaws.com/0/20914/da7c47b1-7af3-c945-6d27-118f1deaa69d.png)

この画面のチェックボックスは
Startmen・intrag:ソフトをスタートメニューに追加する。
Symbole auf Desktop:デスクトップ上にショートカットを置く。
だと思われます。

OKなら「Next」で先に進み、インストール場所を選択したらインストールが始まります。

![image](https://qiita-image-store.s3.amazonaws.com/0/20914/9b66b561-0bec-2a37-c69d-fe32aabedcdb.png)

お疲れ様でした。Estlcamの世界を楽しみましょう！

>次回からはEstlcamの使い方をまとめていこうと思います。
go言語でクロスコンパイルしてみる

クロスコンパイルできるというのは魅力的なのでgolang入門として
LinuxでWindowsのバイナリを作ってみた

# 結果
- 割りと簡単にクロスコンパイルはできた。（コードレベルでの依存性とか互換は除く）
- C言語だとMinGW-w64でクロスコンパイル環境作るのが大変なのに対して、こちらは非常に楽。
- 実行ファイルサイズがちょっと大きい(約2MB)のは色々静的リンクしてあるかららしい。
- 最適化オプション（ -gcflags '-N -l' ）を付けても変わらず。
- クロスコンパイルのコストと秤にかけるとそれぐらいいいかなという気がする。

FAQ - golang.jp
http://golang.jp/go_faq#Why_is_my_trivial_program_such_a_large_binary
>gcツール・チェーン(5l、6l、8l)のリンカは静的リンクを行います。このため、すべてのGoバイナリには、動的型チェック、リフレクション、パニック時のスタックトレース時に必要となる実行時の型情報と一緒に、Goのランタイムが含まれています。
C言語の簡単な「hello, world」プログラムをgccを使いLinux上でコンパイル・静的リンクを行うと約750kBであり、これにはprintfの実装も含まれています。fmt.Printfを使った同様のGo言語のプログラムでは約1.2MBですが、これには高機能なランタイムサポートが含まれています。


# インストール

```bash
# yum install golang
# yum install golang-pkg-windows-amd64
# go version
go version go1.4.2 linux/amd64
```

# ソースの作成と実行、コンパイル

```bash
$ cat hello.go
package main

import "fmt"

func main() {
  fmt.Printf("hello world\n")
}
$ go run hello.go
hello world
$ go build hello.go
$ ./hello
hello world
$ GOOS=windows GOARCH=amd64 go build hello.go
$ ll -h
合計 3.9M
-rwxr-xr-x 1 ymko users 1.9M  7月 30 02:16 hello
-rwxr-xr-x 1 ymko users 2.0M  7月 30 02:17 hello.exe
-rw-r--r-- 1 ymko users   73  7月 30 02:15 hello.go
```

# Windows側で実行

```
C:\tmp> hello.exe
hello world
```


# 参考

はじめての Go 言語 (on Windows) - Qiita
http://qiita.com/spiegel-im-spiegel/items/dca0df389df1470bdbfa
golang でビルド時に最適化をオフにする - tetsuok の旅 blog
http://tetsuok.hatenablog.com/entry/2012/07/01/062325
Golang開発環境 3分クッキング

# あと3分でGolangの環境が欲しい
そういうこと、よくありますよね。
はい、ではこちらにあらかじめ茹でておいた __CentOS 6.5__ の環境があります。

```bash
$ cat /etc/redhat-release 
CentOS release 6.5 (Final)
```

## 0:00　Golangのインストール
```bash
$ cd /usr/local/src
$ wget https://storage.googleapis.com/golang/go1.4.2.linux-amd64.tar.gz
$ tar -C /usr/local -xzf go1.4.2.linux-amd64.tar.gz
```

## 0:29　~/.bashrcにGOPATHを追記
```bash
$ vim ~/.bashrc
```

```vim:~/.bashrc
export GOPATH=/usr/local/go/
export PATH=$PATH:/usr/local/go/bin
```

```bash
$ source ~/.bashrc
```

## 0:48　freshをインストール
_https://github.com/pilu/fresh_
ディレクトリ監視 & 自動ビルド & 実行ツール


```bash
$ go get github.com/pilu/fresh
```

## 1:34　NeoBundleのダウンロード

```bash
$ mkdir -p ~/.vim/bundle
$ git clone git://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim
```

## 1:48　~/.vimrcに以下を追記してvim-goをインストール
_https://github.com/fatih/vim-go_
ここでvim-goのエラー通知を止めているので、freshのログからエラーを読み取ることになります。
また保存後に行われるオートフォーマットも止めています。 
こちらをONにしているとアンドゥが効かなくなります。

```bash
$ vim ~/.vimrc
```

```vim:~/.vimrc
set nocompatible
filetype off

if has('vim_starting')
  set runtimepath+=~/.vim/bundle/neobundle.vim/
endif

filetype plugin indent on

call neobundle#begin(expand('~/.vim/bundle/'))
NeoBundleFetch 'Shougo/neobundle.vim'
NeoBundle 'fatih/vim-go'
call neobundle#end()

let g:go_highlight_functions = 1
let g:go_highlight_methods = 1
let g:go_highlight_structs = 1
let g:go_highlight_operators = 1
let g:go_highlight_build_constraints = 1
let g:go_fmt_fail_silently = 1
let g:go_fmt_autosave = 0
syntax on
```

## 2:05　適当なディレクトリを作りVimを起動
```bash
$ mkdir /usr/local/bin/project
$ cd /usr/local/bin/project
$ vim server.go
```

## 2:19　Vim上で :NeoBundleInstall
```vim
:NeoBundleInstall
```

## 2:37　以下のコードをコピペ
急げ間に合わない。

```go:server.go
package main

import (
        "fmt"
        "net/http"
)

func main() {
        http.HandleFunc("/", root)
        http.ListenAndServe(":8080", nil)
}

func root(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello World.")
}
```

## 2:46　Vimを閉じてfreshを起動
```bash
$ fresh
```
![fresh.png](https://qiita-image-store.s3.amazonaws.com/0/33480/fad743a5-df1c-af42-3423-76bd297761d3.png)


## 3:00　「サーバのIPアドレス:8080」にブラウザからアクセス
_http://localhost:8080_
```Hello World.``` と表示されたら完了。


# ところでGolangってなに？
* 非常に単純な構文の言語です
* __[公式チュートリアル](http://go-tour-jp.appspot.com)__をこなせば大体覚えられる手軽さ
* 並列処理が言語レベルでサポートされていて、割と楽に実装できます（switch-select ﾝｷﾞﾓﾁｲｲ）
* 今のところ存在するORMがちょっとキモい  

## Webフレームワークあんの？
ありますが、MVCの形は自分で作るもの。

#### Goji (Routing & Controller)  
_https://github.com/zenazn/goji_

#### Genmai (Model)
_https://github.com/naoina/genmai_

#### template (View)
_http://blog.inagaki.in/?p=212_

# 3分まで縮めるのに何回練習したの？
お前は今までに打った```vagrant destroy```の数を覚えているのか。
普通にやると5分くらいかかります。

# 参考文献
http://qiita.com/hit/items/875259a27079aff14f98
http://qiita.com/izumin5210/items/1f3c312edd7f0075b09c
http://qiita.com/Kuchitama/items/68b6b5d5ed40f6f96310
Beautiful Soupを使ってスクレイピング


環境 Mac, Python3
##事前準備
Beautiful Soupとlxmlをインストール

```
$ pip install beautifulsoup4
$ pip install lxml
```

途中でエラーが出たけどインストールは成功。
今のところ問題は出てない。

##soupの基本形

```
from bs4 import BeautifulSoup
import urllib.request

# webからhtmlを取得する場合
url = '××××××××××××'
req = urllib.request.Request(url)
response = urllib.request.urlopen(req)
html = response.read()
soup = BeautifulSoup(html, "lxml")
# ローカルのhtmlを直接開くとき
soup = BeautifulSoup(open("index.html"), "lxml")
```
##これからやること
ほしい情報が入っているタグを指定して要素を取得する。


##よく使う指定方法

```find()

- classを指定
   soup.find(class_='class_name')
   # classの後にアンダーバーがないとエラーがでる。
- idを指定
   soup.find(id="id_name")
   # idはそのまま。
- タグも一緒に指定
   soup.find('li', class_='class_name')
   soup.find('div', id="id_name")

```

find()では初めにヒットした1件しか取得されません。
複数取得したい場合はfind_all()を使います。

```find_all()
images = soup.find_all('img')
  for img in images:
    ~個別の処理~
```

```select()
soup.select("p > a")
soup.select('a[href="http://example.com/"]')
```


##実行サンプル

soupにhtmlを読み込んでからのサンプルになります。

###サンプル１：タグに挟まれたテキストを取得する

```sample.html
<html>
  <title>test title</title>
</html>
```

```
>>> soup.title
<title>test title</title>
>>> soup.title.string
'test title'
```

後ろに.stringを追加すると取得できます。

###サンプル２：imgタグのsrcを抽出する

```sample.html
<html>
  <div id="hoge">
    <img class="fuga" src="http://××.com/sample.jpg"/>
  </div>
</html>
```

はじめにid="hoge"のdivタグを取得

```
>>> div = soup.find('div' id="hoge")
<div id="hoge">
  <img class="fuga" src="http://××.com/sample.jpg"/>
</div>
```

  


次にdivからclass="fuga"のimgタグを取得

```
>>> img = div.find('img', class_='fuga')
<img class="fuga" src="http://××.com/sample.jpg"/>
>>> img['src']
"http://××.com/sample.jpg"
```

実際にはこのパターンでdivを取得する必要はありません。
ですが絞り込む形のサンプルにしたかったのでdivをいれました。




参考
http://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-beautiful-soup
Windows10のアップデートに失敗してメディア作成ツールすらも起動しなくなった時の対処

#状況
Windows10がリリースされたのでワクワクしながら待っていたが更新通知が来ないので、コマンドラインから

    wuauclt.exe /updatenow

を実行して強制的にwindows10のインストールを開始したが、Windowsのダウンロードが終わったあとの
「インストールの準備をしています。」
から一時間ほど待ってインストールに失敗。
再度コマンドを実行するも、一瞬でインストール失敗画面が出てくる。

後でMicrosoftが公式で[Windows10メディア作成ツール](https://www.microsoft.com/ja-jp/software-download/windows10)を配布しているのに気が付きこっちを実行してみるも、この画面から一向に進まない。

![fwegw.PNG](https://qiita-image-store.s3.amazonaws.com/0/20914/37a97e99-d331-6798-9e25-dc158a6ce463.png)

自分はシステムの復元、リフレッシュ、OSの再インストールを試みるも失敗。
涙が止まらない…

#対処

    C:\Windows\SoftwareDistribution\Download
の中身を管理者権限ですべて削除。

これでメディア作成ツールが正常に起動するようになった。
Windows8だと仮想イメージディスクドライブ機能がついているため、イメージメディア(ISO)としてダウンロードしたほうが良さげ

「![image](https://qiita-image-store.s3.amazonaws.com/0/20914/24e8f0e3-cb29-af80-7181-2a0f3db00dd4.png)
」

恐らく

    wuauclt.exe /updatenow

コマンドも正常に作動するはず。

同じ症状の人がいたら参考にして欲しい。

#追記
UbuntuからMicrosoftのページにアクセスしたところ、メディア作成ツールではなくISO単体でダウンロードできたので、恐らくブラウザのユーザーエージェントを変更することでメディア作成ツールを使用せずにWindows10をインストールすることが可能
MacでMarkDownをQuickLookする


Homebrewで入れられるようだ。便利。

```shell
brew-cask install qlmarkdown
```

これだけ。

他にも、Homebrewで入れられる[QuickLook用プラグインがいろいろある](https://github.com/sindresorhus/quick-look-plugins)。


おわり。
指定したidの順序でデータを取得する


レコードの並び順のデータが別テーブルにあり、orderで順序指定ができない場合、
activerecord経由でwhere inで取得しても配列の順序通りには当然の如くならない。
(なってくれるといいんだけどな。)

以下のコードでは当然の如くidsの配列の順序にはならない。

```rb
ids = [2,1,4]
arctile = Article.where(id:ids)
#=> id:1,id:2,id:4... 
```
MySQLなら下記のSQLで指定した順序で可能。

```sql
SELECT id FROM model
 WHERE id IN (2,1,4)
 ORDER BY FIELD(id,2,1,4)
```

とはいっても、DBがmysqlとは限らないので、プログラムで並び替える方が楽。

```rb
ids = [2,1,4]
arctiles = Article.where(id:ids)
ordered_article = ids.collect {|id| articles.detect {|x| x.id == id.to_i}}
```
上記だと、idsで指定したものが見つからなかったものはnilとなるので、配列のnil要素を削除。

```rb
ordered_article.compact!
```
NicoBoxでラジオを聴くためにrubyでやったこと

# NicoBoxが神アプリだった件
タイトル通り非常に使えるアプリ`NicoBox`ですが、`2015/07/30`記述時点では不満点もありました

* プレイリストの追加が面倒
* 動画を検索した後のソートが再生数順（らしい）固定

## とにかくバックグラウンドで連続再生したい

いろいろ模索しているとマイリストのインポートあるじゃないですか
しかしここでも問題は発生しました
マイリストに登録された最新のものから順に連続再生されるようにインポートされるのです
なんで逆にしなかったんや
ってことでマイリストをこの仕様に合わせて作ります

## Gemfile
```rb:Gemfile
  source 'https://rubygems.org'

  gem 'niconico'
```

ライブラリは以下をありがたく利用させてもらいました
[sorah/niconico](https://github.com/sorah/niconico)

さっそくインスコ

```bash
bundle install --path vendor/bundle --jobs=4
```

## 実際に書いたコード
```rb
require 'bundler'
Bundler.setup(:default)
require 'niconico'

nico = Niconico.new($email, $password)
nico.login

videos = nico.mylist(45903772) # 公開されているマイリスト番号

filtered_videos = videos.select do |v|
  # 反省会は要らない
  !v.title.match(/反省会/) && v.title.match(/RADIO GREE NIGHT/)
end

nico_api = nico.nico_api

filtered_videos.reverse_each do |v|
  nico_api.mylist_add($mylist_id, 5, v.id) # 5は動画を表す, 0が静止画らしい
  sleep 1.1 # マイリスト登録順はミリ秒単位ではソートされないので１秒以上間隔をあける
end
```

## 最後に
いろいろな制約によってコード書いていて情けなくなりました

花澤香菜さんと雨宮天の掛け合わせが心地いいラジオ番組をマイリストに登録する方法でした
SoftLayer仮想インスタンスのCentOS6にVNC、GNOMEを導入しました

# 1. はじめに
　SoftLayerの仮想インスタンスをCentOS6でデプロイしました。
GUIで遠隔操作の必要があり、<font color="blue">VNC(Virtual Network Computing)</font>とデスクトップ環境の<font color="blue">GNOME(GNU Network Object Model Environment)</font>を導入した際の手順です。


# 2. VNC、GNOME導入と設定  

### 2-1. VNCパッケージの導入
  ```Command:VNCパッケージの導入
# yum –y install tigervnc-server ⏎
```
### 2-2. GNOMEデスクトップ環境パッケージの導入
 ```Command:GNOMEデスクトップ環境パッケージの導入(1)
# yum -y groupinstall "X Window System" ⏎
```
 ```Command:GNOMEデスクトップ環境パッケージの導入(2)
# yum -y groupinstall "Desktop" ⏎
```  
 ```Command:GNOMEデスクトップ環境パッケージの導入(3)
# yum -y groupinstall "General Purpose Desktop" ⏎
```
### 2-3. VNC用ユーザーの追加
ここでは、<font color="blue">admin01</font>と<font color="blue">vncuser01 </font>の２ユーザーを追加しました。
まず、admin01から

 ```Command:admin01の追加
# useradd admin01　⏎ 
```
 ```Command:admin01のパスワード設定
# passwd admin01　⏎ 
```

同じ手順で、vncuser01も作成。

![03.png](http://www.seahorse-inc.com/QIITA/CentOS6-VNC/03.png)

### 2-4. VNCパスワードの設定

```Command:VNCパスワードの設定(admin01)
# su – admin01 ⏎
$ vncpasswd ⏎
$ exit ⏎
#  
```

 ```Command:VNCパスワードの設定(vncuser01)
# su – vncuser01 ⏎
$ vncpasswd ⏎
$ exit ⏎
#  
```

![04.png](http://www.seahorse-inc.com/QIITA/CentOS6-VNC/04.png)


### 2-5. VNCSERVERSの編集
VNCSERVERSに下記３行を追加。
　　　　<font color="blue">VNCSERVERS=”1:admin01 2:vncuser01”
　　　　VNCSERVERARGS[1]=”-geometry 1024x768”
　　　　VNCSERVERARGS[2]=”-geometry 1024x768”</font>

 ```Command:VNCSERVERSの編集
# vi /etc/sysconfig/vncservers ⏎
```
 ```Command:VNCSERVERSファイルに３行追加
VNCSERVERS=”1:admin01 2:vncuser01”
VNCSERVERARGS[1]=”-geometry 1024x768”
VNCSERVERARGS[2]=”-geometry 1024x768”
```
![05.png](http://www.seahorse-inc.com/QIITA/CentOS6-VNC/05.png)

### 2-5. xstartupファイルの自動作成
<font color="blue">xstartup </font>ファイルを作成するために、VNCを起動。

 ```Command:xstartupファイル作製のため、VNC起動
# ervice vncserver start　⏎
```
VNCの停止。

 ```Command:xstartupファイル作製のため、VNC起動
# ervice vncserver stop　⏎
```

### 2-6. VNC利用時のデスクトップ環境をGNOMEに設定
まず、admin01のxstartupを編集。

```Command:xstartupファイル編集(admin01)
# su – admin01　⏎
$ vi ~/.vnc/xstartup　⏎
```
xstartupの下記２行を編集。
　　　　<font color="blue">・twm &  の行をコメントアウト
　　　　・exec gnome-session & の行を追加</font>


```Command:xstartupファイル属性の変更(admin01)
$ chmod +x xstartup　⏎
$ exit
#
```
あと、vncuser01にも同じ作業を行う。

### 2-7. VNCサービスの起動
 ```Command:VNC起動
# ervice vncserver start　⏎
```

<strong>以上でVNC、GNOMEの導入と設定が完了です。</strong>

# 3. クライアントPCからの接続確認
### 3-1. VNCビューアーのダウンロード
ここでは、VNV ビューアーとして、<font color="blue">「VNC-Viewer-5.1.1-Windows-32bit.exe」 </font>を使用します。
https://www.realvnc.com/download/viewer/　
![08.png](http://www.seahorse-inc.com/QIITA/CentOS6-VNC/08.png)
お使いのクライアントPC環境に合わせて、プログラムをダウンロードしてください。

### 3-2. 接続
VNC Server項目は、<font color="blue">「接続先サーバ」+「:」＋「番号」</font> です。
「番号」は、「2-5. VNCSERVERSの編集」で設定した番号になります。

例）admin01の場合　⇒　接続先サーバ:1
　　vncuser01の場合　⇒　接続先サーバ:2

![09.png](http://www.seahorse-inc.com/QIITA/CentOS6-VNC/09.png)

GUIで表示されました。

![20.png](http://www.seahorse-inc.com/QIITA/CentOS6-VNC/10.png)
<strong>以上で、全ての導入・設定が完了しました！</strong>


# 4. おわりに
GUIで遠隔操作出来るようになりました。あとはセキュリティ対策を忘れないように。
Sketch3のプラグインを開発する

Sketch3はプラグインを自作することができる。

>Bohemian Coding - Developer
>http://bohemiancoding.com/sketch/support/developer/01-introduction/01.html

プラグイン開発はプロジェクト全体の効率化に繋がるので、チームに一人プラグインが書ける人がいると良いと思った。FFで言えばシーフみたいな感じ。


#開発手順
Sketch3のプラグイン構造は非常に単純である。

```
name.sketchplugin/Sketch/manifest.json
name.sketchplugin/Sketch/script.cocoascript
```

基本的にはこのようなディレクトリ構造で２つファイルを用意すればいい。
`jsonファイル`と`cocoascript`の２つだ。

まずは、manifest.jsonについて、

#manifest.json

リファレンスを見るとゴチャゴチャ書いてあるが、最低限commandsだけ書いておけば良い。
commandsでは、
・メニューに表示する名前
・押した際に実行するスクリプトファイル
・実行するスクリプトファイルのメソッド名
の３つを書く。

```json:manifest.json
{
  "commands" : [
    {
      "script" : "script.cocoascript",
      "handler" : "onRun",
      "name" : "Script Generator"
    }
  ]
}
```

これで、Sketch3のメニューから実行する事でscript.cocoascriptのonRunメソッドが呼ばれるようになる。

#script.cocoascript

このファイルは別にscript.cocoascriptという名前でなくても良い。
manifest.jsonで指定すればmain.cocoascriptとかどんな名前でも大丈夫だ。

cocoascriptはjsとObjCが混ざったような言語なのだが、臆することはなくてSketchのPlugin>Custom PluginからSketch3上でcocoascriptを実行することが出来る。

いい感じのが書けたらコピペすればいいのだ。

例：

```js:script.cocoascript
var onRun = function(context) {
 var documentName = context.document.displayName();
 log('The current document is named: ' + documentName);
};
```

#インストールとアンインストール
##インストール
name.sketchpluginをダブルクリックすればインストールされる。

##アンインストール
Plugins>Reveral plugins folder
からプラグインのインストール先のフォルダが開くので、そこからプラグインをゴミ箱に捨てればOK
S3内のファイルを簡単に検索する


s3でログをためていったときにファイルを細かく分けてしまったために、１つのフォルダ内に大量のファイルを保存してしまった，検索することができない，どうしよう。となってしまった。その時のメモ
S3のダッシュボードではファイル名を全て知っている場合直接うちこむことで検索することができる。しかし，途中の文字列で絞り込むなど細かい検索はできない。
s3cmd, brewを使用してこの問題を解決してみた。

## 目的
```shell
s3cmd ls s3://バケット名/フォルダ名/ | grep 検索内容
```
というコマンドによってshellからs3の特定フォルダ内を検索する。

## 環境
OS X 10.10.3
Homebrew(http://brew.sh)


## アクセスキー，シークレットキーの確認
S3に外部からアクセスするためにはIAMユーザーのアクセスキー，シークレットキーが必要

AWSダッシュボード -> Identity & Access Management -> ユーザー

から自分のユーザー名を選択すると下の方に「認証情報」というタブがある。そのタブを開けばアクセスキー（下図 Access Key ID）とその発行日を見ることができる。ただしシークレットキーはアクセスキーの発行時以外確認することが不可能であるため控えていなかった場合は再度アクセスキーごと生成しなおす必要がある。

![aws-iam.png](https://qiita-image-store.s3.amazonaws.com/0/63865/513f796a-043d-30ef-a0ef-b807f9dde820.png "aws-iam.png")

## s3cmdのインストールと設定
s3cmdとは名前の通りシェルからs3を直接いじれるツールである。今回はこのツールを用いてフォルダ内検索を行う。

```shell
brew install s3cmd
s3cmd --configure
```
configureの際，アクセスキーとシークレットキーを求められるので入力，それ以外は何も入力せずにEnterでOK
configureによって~/.s3cfgという設定ファイルが生成される。

## s3cmdを使ってs3の内容を表示する
```shell
s3cmd ls
```
を行うと現在アクセスできるs3のバケット一覧が表示される。

```shell
s3cmd ls s3://バケット名/
```
同様にバケットを指定することでバケット内のディレクトリ一覧を取得できる。

```shell
s3cmd ls s3://バケット名/フォルダ名/
```
によってフォルダ内を表示することができる。

## s3cmdを使ってフォルダ内を検索する
shellでフォルダ内を表示できたならあとはgrepを使えば検索できるはず！

```shell
s3cmd ls s3://バケット名/フォルダ名/ | grep 検索内容
```
これでフォルダ内のファイルを検索することが可能になった。
Redis の Sorted Sets で SDIFF のように差を取得する

既に出ているネタのような気がしてなりませんがメモがてら。

## Sets 型には SDIFF がある

http://redis.io/commands/sdiff

よって以下のように２つの Sets の差を取る事ができます

```shell-session
> SADD key1 a b c d e
(integer) 5
> SADD key2 b c e
(integer) 3
> SDIFF key1 key2
1) "a"
2) "d"
```

## Sorted Sets には DIFF が無い

http://redis.io/commands#sorted_set

`UNION` や `INTER` はあるのですが、`DIFF` はありません。ソート済の制約なのだろうと思うのですが、ある用途で必要になりました :sweat: 

### 一回 store を挟めば似たような事はできる

Sorted Sets の `ZUNIONSTORE` は指定したキーに `WEIGHTS` を指定でき、かつキーが同じだった場合の `AGGREGATE` の挙動を設定できます。

http://redis.io/commands/zunionstore

例えば以下のような２つのキーがあるとします。`exclude_key` が除外したい値を持つ Sorted Sets です。

```shell-session
> ZADD main_key 1 a 2 b 3 c 4 d 5 e
> ZADD exclude_key 2 b 3 c 5 e 6 f 7 g
```

```shell-session
> ZUNIONSTORE tmp_key 2 main_key exclude_key WEIGHTS 1 0 AGGREGATE MIN
(integer) 7
```

ここでできる `tmp_key` は UNION された結果なので同じキー（ここでは b c e が同じ）は結合されます。

この時、`exclude_key` の score は 0 倍されるため、0 になります。さらに `AGGREGATE` で `MIN` が指定されたため、結合時には小さい方の score が優先されます。よって、以下のように b, c, e, f, g は score が 0 という扱いになります。

```shell-session
> ZRANGE tmp_key 0 -1 WITHSCORES
 1) "b"
 2) "0"
 3) "c"
 4) "0"
 5) "e"
 6) "0"
 7) "f"
 8) "0"
 9) "g"
10) "0"
11) "a"
12) "1"
13) "d"
14) "4"
```

最後に 0 以外の score を取得する事で、`exclude_key` の値が省かれた値のみができます。

```shell-session
> ZRANGEBYSCORE tmp_key 1 +inf
1) "a"
2) "d"
```

当然ながら store を挟む分だけ Sets の SDIFF よりパフォーマンスは不利になりますが、ソートが重要になるデータの場合には選択できる手段ではないでしょうか。
Electron の <webview> 内でリンクを開いたときに外部ブラウザで開く

Electron で [`<webview>`](https://github.com/atom/electron/blob/master/docs/api/web-view-tag.md) を使って UI をつくっていると，一般的なデスクトップアプリのようにリンクをクリックした時に外部ブラウザでそれを開きたいことがあります．
`<webview>` 内でリンクをクリックして遷移しようとしたときにフックして外部ブラウザで代わりに開く処理を実装したのでそのメモです．

Electron の `<webview>` のドキュメントは[ここ](https://github.com/atom/electron/blob/master/docs/api/web-view-tag.md) にすべてあります．（これだけしかないとも言う）

なお，renderer プロセスからでも `require('shell').openExternal(url)` で外部ページを直接開くことができます．（実際には `url` をプロセス間通信でブラウザプロセス側に送り，そちらで外部ブラウザに渡しているようです）

## `'new-window'` イベント

`<webview>` にいくつかあるイベントのうち，`'new-window'` イベントを受けると，`<webview>` 内のゲストページが新しいウィンドウを開こうとしたときにそれをフックすることができます．

```javascript
let webview = document.getElementById('my-cool-webview');
webview.addEventListener('new-window', function(e){
    console.log('Guest window is openning new window: ' + e.url);
    require('shell').openExternal(e.url);
});
```

しかしこれだけでは充分ではありません．このイベントはゲストページが新しいウィンドウ（タブ）をつくろうとしたときに発生するため，ページ内で別の URL に遷移した場合には発火しません．

## `'did-start-loading'` イベント

そこで，dirty hack 気味ですが `'did-start-loading'` イベントを使います．このイベントはゲストページがページをロードし始めた時に呼ばれます．よって，「ゲストページが別ページをロードしようとした時にそれを妨害してブラウザでウィンドウを開いてやる」という処理でやりたいことが実現できます．ゲストページの読み込みを止めるには `webview.stop()` メソッドを，ゲストページが開いている URL を取るには `webview.getUrl()` メソッドがそれぞれ使えます．

```javascript
let webview = document.getElementById('my-cool-webview');
webview.addEventListener('did-start-loading', function(e){
    const url = webview.getUrl();
    console.log('Guest window is loading new page: ' + url);
    webview.stop();
    require('shell').openExternal(url);
});
```

## まとめ

まとめると次のような処理でやりたいことが実現できます．`webview` がページをロードする前に `'did-start-loading'` をフックしてしまうと最初の読み込みも邪魔してしまうと思うので，`'dom-ready'` で読み込みが完了したときにフックを仕掛けるようにします．また，`'did-start-loading'` 中は読み込みを中止する前に `getUrl()` で開こうとしていたページを取得しておきます．

```javascript
const shell = require('shell');
let webview = document.getElementById('my-cool-webview');

webview.addEventListener('new-window', function(e){
    shell.openExternal(e.url);
});
webview.addEventListener('dom-ready', function(e){
    webview.addEventListener('did-start-loading', function(e){
        const url = webview.getUrl();
        webview.stop();
        shell.openExternal(url);
    });
});
```

これでアプリの中のページ遷移を抑えつつリンクは外部のブラウザで開くようにできました．
mysqldump: Got errno 28 on write になった

タイトルのエラーが出た
調べた

```
[root@kakeru-db01 ~]# mysqldump --databases kakeru1 kakeru2 --dump-slave --apply-slave-statements > /tmp/`hostname`.dump
mysqldump: Got errno 28 on write
[root@kakeru-db01 ~]# df -hT
Filesystem    Type    Size  Used Avail Use% マウント位置
/dev/sda2     ext4     30G   30G     0 100% /
tmpfs        tmpfs     48G     0   48G   0% /dev/shm
/dev/sda1     ext4    504M   63M  416M  14% /boot
/dev/sda4      xfs    525G   84G  442G  16% /data
[root@kakeru-db01 ~]# rm /tmp/kakeru-db01.dump 
rm: remove 通常ファイル `/tmp/kakeru-db01.dump'? yes
[root@kakeru-db01 ~]# df -hT
Filesystem    Type    Size  Used Avail Use% マウント位置
/dev/sda2     ext4     30G  4.2G   24G  15% /
tmpfs        tmpfs     48G     0   48G   0% /dev/shm
/dev/sda1     ext4    504M   63M  416M  14% /boot
/dev/sda4      xfs    525G   84G  442G  16% /data
[root@kakeru-db01 ~]# mkdir /data/backup/
[root@kakeru-db01 ~]# mysqldump --databases kakeru1 kakeru2 --dump-slave --apply-slave-statements > /data/backup/`hostname`.dump   
```
disk100%担ってただけっていうね。
馬鹿かっていうね。
おわり。
【デザインパターン再入門】コードを動かしながら理解をしたいなら｢java-design-patterns｣がオススメ

#はじめに

GoF本、本としてのボリュームがあって挫折した方も多いのではないでしょうか。
活字を追うよりはコードを実際に追った方が楽だ！とお思いの方には、GitHubの｢java-design-patterns｣を
オススメします。 コード以外にもクラス図が同梱されていてかなり便利です。 

https://github.com/iluwatar/java-design-patterns

# 網羅されているパターン

網羅されているパターンは以下の53種類です。(2015/07/29 現在)

* abstract-factory
* adapter
* async-method-invocation
* bridge
* builder
* business-delegate
* callback
* chain
* command
* composite
* dao
* decorator
* dependency-injection
* double-checked-locking
* double-dispatch
* event-aggregator
* execute-around
* facade
* factory-method
* flux
* flyweight
* front-controller
* intercepting-filter
* interpreter
* iterator
* lazy-loading
* mediator
* memento
* model-view-controller
* model-view-presenter
* multiton
* naked-objects
* null-object
* object-pool
* observer
* poison-pill
* private-class-data
* property
* prototype
* proxy
* repository
* resource-acquisition-is-initialization
* servant
* service-layer
* service-locator
* singleton
* specification
* state
* strategy
* template-method
* thread-pool
* tolerant-reader
* visitor

null-object、double-checked-locking等があったりと、GoF本に載っていないけどよく使わられるパターンも網羅されています。
double-checked-lockingは有名なsynchronized句によるアウトオブオーダー書き込みを避けるように
書かれていて、個人的におおーっと思いながらコードを読んでいました。

# プロジェクトをEclipseへインポートする手順

実際に手元で動かしたい方は、以下の手順でリポジトリを落としてきて、Eclipseにインポートしましょう。
(IntelliJ、NetBeans等他のIDEを使ってる方ごめんなさい)

```
git clone https://github.com/iluwatar/java-design-patterns.git
cd java-design-patterns
mvn eclipse:eclipse
```

その後、Eclipseのパッケージエクスプローラーからインポートをします。

![Java_-_Eclipse_-__Users_nikuyoshi_workspace.png](https://qiita-image-store.s3.amazonaws.com/0/10044/acc2d23e-2a2f-a898-ae81-345cb930c758.png)

↓

![Screen Shot 2015-07-29 at 23.03.13.png](https://qiita-image-store.s3.amazonaws.com/0/10044/4e87c96f-34f9-f7e7-0e61-f654f017c590.png)

↓

![Screen Shot 2015-07-29 at 23.09.52.png](https://qiita-image-store.s3.amazonaws.com/0/10044/bd9bb3a3-e110-da49-433e-c444b573ac8c.png)

`java-design-patterns`のフォルダを指定して、任意のフォルダをインポートします。

するとこんな感じで、一気にプロジェクトが並びます。

![Screen Shot 2015-07-29 at 23.12.02.png](https://qiita-image-store.s3.amazonaws.com/0/10044/1dea0bd1-e5dd-3e4d-a7db-54f0fa40e8cf.png)

各プロジェクトに`App.java`というmainメソッドを実装しているクラスがあるので、任意の場所でブレークポイントを打ってデバッグしながらコードを追っていくと理解が深まると思います。

また、各プロジェクトに`*.ucls`というファイルがあります。 それがクラス図です。
そのファイルを読むには、ObjectAid UML Explorerが必要です。以下のページを見ながらインストールをしてみてください。

http://www.objectaid.com/download

実際に`abstract-factory`のクラス図を開いてみると、以下通り各クラスの関係が分かると思います。

![Screen Shot 2015-07-29 at 23.23.01.png](https://qiita-image-store.s3.amazonaws.com/0/10044/a0653e55-c676-d112-7fe2-e9548997f00a.png)

一日一つずつでも良いので、実際にコードを追ってみましょう。デザパタの知識がより一層身に付くと思います。

# 参考

double-checked lockingとSingletonパターン
https://www.ibm.com/developerworks/jp/java/library/j-dcl/
Boot2dockerメモ


## Boot2dockerとは

[Boot2docker](http://boot2docker.io/)

VirtualBoxのフロントエンドとして動き、必要な準備をやってくれます。
Docker専門のVagrantって感じ。

``boot2docker``と``docker``の2つのコマンドがインストールされます。

### boot2dockerコマンド

Boot2dockerの仮想マシンを操作するためのコマンド。
サブコマンドと組み合わせて使います。

* ``boot2docker init`` Boot2dockerの仮想マシンイメージをDLしてきて準備してくれる
* ``boot2docker up`` 仮想マシンを立ち上げる 
* ``boot2docker halt`` 仮想マシンを終了する
* ``boot2docker upgrade`` 仮想マシンとかコマンド類を更新


### dockerコマンド

Dockerコンテナを操作するためのコマンド。
普通にインストールする``docker``コマンドと同じ。
なので詳細はDockerのドキュメント参照。

Boot2dockerの手順に沿って環境変数を設定すると、デフォルトでBoot2dockerの仮想マシンに対して叩くようになります。手間が省けて便利。

## 使い方

OSX版のBoot2dockerは、アプリ一覧のアイコンからとコマンドラインから``boot2docker``コマンドを叩く方法のどちらでも使えます。

### コマンドライン版

1. ``boot2docker init`` 仮想マシンの準備。初回のみ。 
2. ``boot2docker up`` 仮想マシンの起動。``boot2docker start``でも同じ。
3. ``eval "$(boot2docker shellinit)"`` 環境変数を設定。

``.bashrc``等に3のコマンドを書いておけば1回で済みます。



### アプリアイコン版

[公式サイトのドキュメント](http://docs.docker.com/installation/mac/#from-the-applications-folder)によると、``docker``コマンドを使える状態まで一気に持っていってくれるみたいです。

### ちょっとハマったこと

Boot2docker仮想マシンの実行中に、ホストマシンのインターネット接続経路が変わると、通信できなくなります。

具体的には、自宅のWi-FiでDockerイメージを落としたりして、そのままPCをスリープさせて、出先でテザリング接続した場合など。
ホストOSからは普通にネットに抜けられるのに、Boot2docker仮想マシンは駄目な状態になります。

ちゃんと調べてないけど、VirtualBoxのNATアダプタの挙動のような気がする。
cocoaPods 使用方法


1.新建一个工程 eg.CocoaPodsTest

2.终端，进入工程主目录!
![2158296A-002C-432D-B87E-1A4B25069BA5.png](https://qiita-image-store.s3.amazonaws.com/0/86940/3cc2e287-0e80-d49a-31ca-ac496bad8d09.png "2158296A-002C-432D-B87E-1A4B25069BA5.png")



3.Pod search 'MJRefresh'            //第三方库名
4.记下第三库的版本号 备用
![C7FA1158-48EC-444C-B7CA-FC452B36A659.png](https://qiita-image-store.s3.amazonaws.com/0/86940/f15ee307-edee-6220-5981-d1a442fca2ef.png "C7FA1158-48EC-444C-B7CA-FC452B36A659.png")


5.添加Podfile到工程主目录 vim Podfile
![E8286F61-28D0-413F-9656-5BBA9E3382E2.png](https://qiita-image-store.s3.amazonaws.com/0/86940/e3c33426-0009-1de1-7279-3e27df6418ea.png "E8286F61-28D0-413F-9656-5BBA9E3382E2.png")


6.然后 :wq 保存退出
7.输入命令：pod install
8.成功后会有这样的提示
![FF845CF3-C8F6-4AB0-A273-62B9D7635666.png](https://qiita-image-store.s3.amazonaws.com/0/86940/bdd9f3fa-c018-426c-ea66-46cbdc7bc054.png "FF845CF3-C8F6-4AB0-A273-62B9D7635666.png")


ps.意思是重新用CocoaPodsTest.xcworkspace来打开工程
直接用命令 open CocoaPodsTest.xcworkspace来打开

9.然后就好了 如果：
![B1835281-75EE-442A-81F2-B7EC726F1052.png](https://qiita-image-store.s3.amazonaws.com/0/86940/2f6478ae-4392-6bcb-6584-2a5bfb6ef4c5.png "B1835281-75EE-442A-81F2-B7EC726F1052.png")


10.如果导入头文件找不到第三方头文件。
工程设置->building settings 找到user header search paths  然后新增${SRCROOT},并将后面改为recursive
![34065CAD-252D-4742-AE04-02B859EBD2D2.png](https://qiita-image-store.s3.amazonaws.com/0/86940/3706cc32-7489-871b-a2de-92d834bea9d0.png "34065CAD-252D-4742-AE04-02B859EBD2D2.png")



Over!!!!