OmniAICreator/Qiita-1.07M huggingface dataset:
映像伝送するときの通信速度の考え方 [基本]

機械系から情報系に移った人間としては、データ量に関する話が全くわかりませんでした。
データ量についてわからないので、**通信速度の限界**みたいな話になると、完全にお手上げです。

例えばUSBカメラが1つあって、接続先のパソコンから別のパソコンにリアルタイムで動画を伝送したいとき、**どのくらいのサイズ**の映像だったら、**何fpsで**送れるのか。
パソコン周りがいろいろと複雑に見えすぎて、全く見当がつきませんでした。

同じように、他分野から移ってきた人(基礎をあまりやってこなかった人)は悩むと思うので、とっかかりの部分を書きます。
落ち着いて考えれば簡単でした。


## 考え方
基本的に通信速度を考える際は、**１つのデータの量**と、**伝送の頻度(fps)**と、**経路(ケーブルなど)の容量**に注目すればいい。

## 簡単な例を使って実際に考える
先ほど挙げた、「USBカメラが1つあるときに、接続先のパソコンから別のパソコンにリアルタイムで動画を伝送したい」例。
[![https://gyazo.com/0f5903c17a615cd284f009e0ed97d325](https://i.gyazo.com/0f5903c17a615cd284f009e0ed97d325.png)](https://gyazo.com/0f5903c17a615cd284f009e0ed97d325)  

### 1つのデータ量
以下の映像を仮定します。
サイズ： 1280×1024
カラー： RGB
このとき、単純なbitmap画像を考えると、1ピクセルが持つ情報はRGB。
RGBは基本的に、それぞれ0-255の8bit、つまりそれぞれ1byte。
よって、1ピクセルが3byteのデータ量になります。
[![https://gyazo.com/47dd656f957afaa38d903de289c72cdf](https://i.gyazo.com/47dd656f957afaa38d903de289c72cdf.png)](https://gyazo.com/47dd656f957afaa38d903de289c72cdf)  
これが1280×1024ピクセルあるので、
1枚の画像のデータ量は、
3×1280×1024[byte]
= 3×1280×1024÷1024 [K byte]
= 3×1280×1024÷1024÷1024 [M byte]
= 3.75 [MB]
です。

### 伝送頻度(fps)
fpsはframe per secondなので、1秒間に何個のデータを送るかです。
30fpsを仮定すると、上で考えたように1つのデータ量が3.75[MB]であれば、1秒間に送信するデータの量は、
3.75×30 [MB/s] = 112.5 [MB/s]
です。つまり、1秒間に112.5メガバイトのデータを送れれば、うまく通信できるということになります。

### 経路(ケーブルなど)の容量
経路の通信容量の単位では、bpsというものをよく見ます。bit per secondの略です。
LANケーブルだと、1Gbpsのものを最近よく見ます。
1秒間に1ギガビットのデータを送れる、ということです。
では、**このケーブルで、さっき考えた映像の伝送はできるでしょうか？**
確かめるために単位を揃えます。
バイトをビットにして、メガをギガにします。
112.5 [MB/s]
= 112.5×8 [Mbps]
= 112.5×8÷1024 [Gbps]
= 0.879... [Gbps]
1秒間に送るデータの量は、0.879ギガビットです。
つまり、**できそうです**。

## 実際のケース
### 経路の複雑さ
実際は、同じ部屋内での通信ではなかったり、無線LANを使ったり、カメラとパソコンをつなぐケーブルも考えたり、と、経路の部分が複雑になると思いますが、考え方は同じです。
1番容量が小さい経路に律速されることだけ注意すれば大丈夫です。
### 画像圧縮
画像はjpgやpngなどの形に圧縮されていることがほとんどです。その場合、画像1枚のデータ量がどれくらいになるかを計算しなおせば大丈夫です。
ただ、画像を圧縮する場合は、圧縮する時間も考慮する必要があることに注意してください。
Oracle限定：SQLだけでカレンダー出力

ROWNUMの指定を使わなければOracle DB以外でも応用はできると思いますが、以下のSQLで任意のカレンダー出力が可能です。

```sql
SELECT 
  start_date + ROWNUM -1 calendar
FROM (
  SELECT 
    TRUNC(
      TO_DATE('20170221','YYYYMMDD')  -- 表示開始の年月日を指定
    ) start_date, 
    90 days -- 表示したい日数を指定
FROM 
  DUAL
) ,ALL_CATALOG -- 表示したい日数分の行数があるテーブルを指定 = ROUNUMで利用
WHERE 
  ROWNUM <= days
```

こんな方法もあるんですねぇ:sunflower:
Advent Calendarにいいね数とコメント数を表示させてみた

![Screenshot from 2016-12-15 21-44-40.png](https://qiita-image-store.s3.amazonaws.com/0/69767/0ecdcbcf-607f-796f-aca9-45a30a522efb.png)
ちょっとだけ、見にくいなぁ。
なので、これを、、、
![Screenshot from 2016-12-15 21-45-07.png](https://qiita-image-store.s3.amazonaws.com/0/69767/b7a85174-a1b1-d963-b72d-ffd1c8b2d364.png)
こんな感じにいいね数とコメント数を表示させてみた。(Qiitaの記事だけ)

以下のスクリプトをTampermonkeyなどに追加。

```javascript
// ==UserScript==
// @name Add number of like and number of comment at a advent calendar for Qiita
// @match        http://qiita.com/advent-calendar/*
// ==/UserScript==

(function() {
    'use strict';

    var get = (url) => {
        return new Promise((resolve) => {
            var xhr = new XMLHttpRequest();
            xhr.onload = (e) => {
                resolve(e.currentTarget.response);
            };
            xhr.open('GET', url);
            xhr.responseType = 'document';
            xhr.send();
        });
    };

    var anchors = document.querySelectorAll('.adventCalendarCalendar_comment > a[href^="http://qiita.com"]');
    anchors.forEach((anchor) => {
        anchor.parentNode.style.height = 'auto';
        get(anchor.href).then((doc)=>{
            // いいね数
            var like_count = doc.querySelector('.js-likecount').textContent;
            var like_p = document.createElement('p');
            like_p.textContent = `👍 ${like_count}`;
            anchor.parentNode.appendChild(like_p);

            // コメント数
            var comment_count = doc.querySelector('.itemsShowHeaderStock_count[content]').textContent;
            var comment_p = document.createElement('p');
            comment_p.textContent = `💬 ${comment_count}`;
            anchor.parentNode.appendChild(comment_p);
        });
    });
})();
```
![Screenshot from 2016-12-15 22-00-35.png](https://qiita-image-store.s3.amazonaws.com/0/69767/9a99954a-192f-382e-deed-eff6215e3bd7.png)

# まとめ
ちょっとだけ、見やすくなった。
リモートサーバ上の開発環境でFTPを使わずにSublimeTextで開発する（win版）

弊社ではaws上にそれぞれ個人の開発環境をvagrantで構築しています。
vimを使ってる方もいますが、個人的には使い慣れたSublimeTextを使いたい！
ということで下記の方法で実現しました。

# 1.sambaをサーバ上にインストール
```
$ yum install samba
```

ユーザを作ります

```
$ pdbedit -a -t -u user
```

smb.confの設定をします
変更前にバックアップを取っておいたほうがいいかも

```
$ vim /etc/samba/smb.conf

[global]
  workgroup = MYGROUP
  server string = Samba Server Version %v
  unix charset = UTF-8
  dos charset = CP932
  display charset = UTF-8
  unix extensions = no
  wide links = yes
  follow symlinks = yes

  log file = /var/log/samba/log.%m
  max log size = 50

  security = user
  passdb backend = tdbsam

  load printers = yes
  cups options = raw

[homes]
  comment = Home Directories
  browseable = no
  writable = yes
  path = %H
  create mask = 644
  directory mask = 755

[printers]
  comment = All Printers
  path = /var/spool/samba
  browseable = no
  guest ok = no
  writable = no
  printable = yes
```

SambaとNMBの起動

```
$ service smb start
$ service nmb start
```


# 2.ポートフォワーディング設定
SSHクライアントでサーバに接続し、ポートフォワードの設定をします。
私が使ってるRLoginだとこのような画面になります。
![portfored.png](https://qiita-image-store.s3.amazonaws.com/0/93882/bcd10c8e-4c0e-065c-c4d9-9cd13f238ba0.png)



# 3.Loopback Adapterの設定
Microsoft Loopback Adapter をインストールする方法はこちらからー
https://support.microsoft.com/ja-jp/kb/236869
インストールしたら、
・コントロールパネルの「ネットワークの状態とタスクの表示」を開きます
・左にある「アダプターの設定の変更」をクリック
・Microsoft Loopback Adapterをダブルクリック
・「プロパティ」ボタンを押します
設定は下記のようにします。
![Loopback.png](https://qiita-image-store.s3.amazonaws.com/0/93882/9b125ffd-d321-5962-a09b-c13b1aee1450.png)
詳細設定のDNSとWINSのタブは下記のように。
![dns.png](https://qiita-image-store.s3.amazonaws.com/0/93882/b1fe1295-c8ad-5f14-a079-9e39f6e66a5b.png)
![wins.png](https://qiita-image-store.s3.amazonaws.com/0/93882/e6416750-cc6e-76a8-8949-5857f65b1661.png)

# 4.Sambaに接続
エクスプローラで\\169.254.0.1で接続すると
ユーザ認証画面が開いて接続できます。
これでSublimeでディレクトリごと開いてプロジェクト化することで、
開発環境が整いました。


## 参考
http://taropohci.blogspot.jp/2014/03/windowsvagrantsamba.html
http://masa-cbl.hatenadiary.jp/entry/20121013/1350123747
Scalaのimplicitのユースケース

Scalaのimplicitキーワードのユースケースを整理する。

## pimp my library
  ユースケース: 既存のクラスに、メソッドを追加する。

```scala
  implicit class RichString(val src:String) {
    def sing:String = src + " duck";
  }
  "hello".sing // "hello duck"
```

## implicit parameter(1)
  ユースケース: ダイナミックスコープみたいに、引数で明示せずにコンテキストを変更する。

```scala
  // 関数定義：
  def do_some_db_manipulation(...)(implicit con:Connection) {
    con.select(...)
  }

  // 呼び出し:
  implicit val cona = connect(...)
  do_some_db_manipulation() // use cona as con:Connection 
```

## implicit parameter(2)
  ユースケース: Haskellの型クラスのようなものを実現する。

```scala
  // 型クラスの定義
  trait Duck[A] {
    def sing(a:A):Unit
  }
  implicit object DuckInt extends Duck[Int] {
    def sing(a:Int) = println("Int:%d".format(a))
  }
  implicit object DuckString extends Duck[String] {
    def sing(a:String) = println("String:%s".format(a))
  }

  // 呼び出す側
  def sings[A](xs: List[A])(implicit m:Duck[A]) = {
    for ( x <- xs ) {
      m.sing(x)
    }
  }

  // test
  sings(List(1,2,3))
  sings(List("a","b","c"))

  // implicitlyを使ったシュガーシンタックス。singsと同義
  def sings2[A:Duck](xs: List[A]) = {
    for ( x <- xs ) {
      implicitly[Duck[A]].sing(x)
    }
  }

```
【Windows版】 Discord テーマの適用と背景画像設定

#前提
[Discord](https://discordapp.com/)がインストールされていること
現時点ではWindows版のみ？(後から調べたらLinux,Mac版も別の所から落とせるっぽいです)

#BetterDiscordのインストール
[BetterDiscord](https://betterdiscord.net/home/)のページからWindows版を落とします。
落としてきたzipを解凍して中に入ってるexeファイルをダブルクリックで起動
![](https://i.gyazo.com/99e42141ce467d70d53c1da7dff12a53.png)

利用規約を確認して同意(Accept)を押してポチポチしていくと
この画面に移ります。
![](https://i.gyazo.com/fa4908b4435c852a1432a4f12b0b5933.png)
一番上(インストール後にDiscordを再起動する)にだけチェックを入れてInstallをクリック

#テーマを落としてくる
[ここ](https://betterdocs.net/themes.html)にいい感じのテーマがあるので落としましょう

僕はとりあえずRebornというテーマにしました

多分Downloadを押すと広告ページかなんかに飛ばされたあとgithubというサイトにリダイレクトされると思います。
ちょっと見づらいレイアウトかもしれませんが画像にあるRawと書かれた場所を右クリックして
"リンク先を保存"します。
![](https://i.gyazo.com/ccc48b33180424311dc2414f2bedd47f.png)

そうするとローカルに.cssファイルをダウンロードできたと思います。なかったらもう知りません。

#落としてきたcssファイルの適用
BetterDiscordインストールのときにオプションで再起動を指定したのでDiscordが立ち上がってることでしょう。
ついでにいうとテーマ探しの間にBetterDiscord本体もDiscordに適用されてる頃かな？
<font color="lightgray">右下のあたりでBetterDiscordインストールしてるよ！みたいなメッセージがあったら少し待ってあげてください。</font>

Discord画面左下にある歯車マークから設定画面を開いてみると
![](https://i.gyazo.com/7336628994e0bc75314f66ec536845bc.png)
一番下にBetterDiscord設定欄が追加されてると思います。
その中のThemesタブを開いてOpen Theme Folderをクリックするとエクスプローラからフォルダが開きます。
<font color="lightgray">もし開かなかったらWin+Rを押して"指定して実行"を開いたあと
%appdata%
とだけ入力して開いたフォルダ内からBetterDiscord->themesと進むと空のフォルダが開きます。
</font>
開いたフォルダに先程ダウンロードした.cssファイルをぶち込んでDiscordを再起動します。
(Discordはウィンドウを消してもタスクトレイに常駐するので右クリックしてQuit Discordしてあげてください。)
![](https://i.gyazo.com/9ebf3e6d774e692e3daa3689eb709879.png)

再びDiscordを開き、先程フォルダに入れたテーマを有効にしてあげましょう
たしか即時反映だったと思います。
![](https://i.gyazo.com/f4617bbf2a7560ceaf458540193080e3.png)

#壁紙を変えよう
なんだかんだデフォルトの画像がカッチョいいので満足する人も多いかと思いますが
それでも壁紙を変えたいんだ！って人のために一応

まずはいい感じの壁紙を探して、それをどっかしらにアップロードします。
僕はgyazoにしたけど[imgur](http://imgur.com/)なんかが一番簡単だと思います。
ページのヘッダーにあるNew Postをクリックして画面内に画像をドラッグするとすぐアップロードできます。
![](https://i.gyazo.com/0779eb3760cd016607ead68d99a2ff40.png)
アップロードページの<font color="red">画像の上で右クリックをし、**画像アドレスをコピー**してください。</font>
画像をコピーだとダメです。死にます。

先程のテーマ適用時に開いたフォルダの中にある.cssファイルをメモ帳などのテキストエディタで開きます。
>background:url(https://なんちゃらかんちゃら.png)!important;

と書かれている行を探します。
(大抵の場合見やすいように書いてくれてありますが、パソコンオタクな方はCtrl+Fなんかで検索しましょう)
見つかったら括弧内に書いてあるURLを削除してコピーしておいた画像アドレスをペーストしてください。
![](https://i.gyazo.com/378046093264dd296fca8e6e99c9e6e7.png)
最終的にこんな感じ

終わったらファイルを上書き保存してDiscordを再起動しましょう(タスクトレイから落とすことを忘れずに)
今日からできるruby on railsリファクタリングtips１２選

# 俺たちに明日はない。


迷い込んだ草木鬱蒼と生い茂る森。
草木を掻き分け進むのに疲れ、倒れこんだ。
ふと香る懐かしい匂い。
彼は思い出した。
そうそれは彼自身が作った森だったのだ。

明日やろうで溜まっていく負債を一つから摘むための
もうほんと今日にでもできるtips集めました。

[ベーシック](https://basicinc.jp/)のAdvent Calendar 2016の15日目の記事いきます。

# tipsたち
 
###①後置if
これを！

```
if ningen=="damono"
     p "mitsuo"
end
```

こう！

```
p "mitsuo" if ningen=="damono"
```

これぐらいのコードなら気にならないですが、
ネストが深くなった場合は分岐をワンライナーにすることを意識。
すっきりします。すっきりは正義。

###②ブロックで後置if
これを！

```
if type=="mitsuo"
	ningens.each do |damono|
	     p "damono"
	end
end
```

こう！

```
ningens.each do |damono|
     p "damono"
end if type=="mitsuo"
```

ブロック一つから、ネストを防ぎましょう。

###③tryと&.めちゃ便利
`kuni.ken.shi.machi`のようにできる関連付けられるモデルがあるとき、
`ken`が`nil`で`kuni.ken.shi`をしようとすると`nil.shi`になり、エラーになります。そこでnilかどうかチェックしますが、

そこで、こういう後置ifを・・・

```
p kuni.ken.shi if kuni.ken.present?
```

tryへ！

```
kuni.ken.try(:shi)
```

こういうのも・・・

```
if kuni.present?
	if kuni.ken.present?
		if kuni.ken.shi.present?
			p kuni.ken.shi.machi 
		end
	end
end
```

こうできる！

```
kuni&.ken&.shi&.machi
```

ネストもif文も極力ないのが優しいコードです。
&.を使ってネストやif分岐とさよならしましょう。

###④むしろnil.〜の場合にならないようにする。

例えば、oem.client.idではなくoem.client_idにする。
関連付けられたモデルならシンプルにidを引っ張るようにする。原点回帰！

###⑤transaction
[transaction](http://railsdoc.com/references/transaction)、saveが２個以上あったときに使いました。
sakanactionみたいでかっこいいですし、
ちゃんとロールバックしてくれてデータに誤りが生まれないようにもできます。
saveの間に更新するもので失敗がありえないとしても、
見えづらい制約を作らないためにtransactionしましょう。

###⑥ネストしすぎならreturn if 〜

これを

```
if ningen=="damono"
     return "mitsuo"
else
     return "dazai"
end
```

こう！

```
return "mitsuo" if ningen=="damono"
return "dazai"
```

###⑦returnでredirect_toとかrenderかぶり回避。

これを

```
if ningen=="damono"
     redirect_to "mitsuo"
     return
else
if ningen=="shikkaku"
     redirect_to "dazai"
     return
end
redirect_to "murata"
```

こう！

```
return redirect_to "mitsuo" if ningen=="damono"
return redirect_to "dazai" if ningen=="shikkaku"
return redirect_to "murata"
```

###⑧joinsでドゥン
これでchildの中身を見てparentを選べます

```
parent = Parent.joins(:child).where(childs: {id: child_ids})
```

###⑨変更は基本、その値のモデルで。
値の変更に条件分岐など必要な場合は、
その対象モデルの中でメソッドを作ってあげてそれを呼ぶんで変更するようにしましょう。
モデルが関連付けが多かったらcontrollerがもっさりするので、modelにわけることでcontrollerをすっきりできます。


###⑩三項演算子で代入
これは、

```
ningen = 'damono'
ningen = 'shikkaku' if who == "dazai"
```

こう。

```
ningen = who == "dazai" ? "shikkaku" : "damono"
```

###⑪decorator
[decorator](http://ruby-rails.hatenadiary.com/entry/20150415/1429031791)はmodelに紐づく形でメソッドを定義できます。
Hitoモデルにmyouzi・namaeがあるとすると
hito_decoratorにfullnameメソッドを用意してhito.decorate.fullname => myouzi + namaeと表示できるように定義します。
viewの記述を減らすためのhelperと考えていいです。
基本的にはdecoratorで値などの実際に変更したりなどしないようにしましょう。とりあえず僕は今までdecoratorで値を変更したことはないです。
はじめhelperとdecoratorがごちゃごちゃしないか不安で無駄なような気がしたのですが、やってみると便利でした。


###⑫共通化しすぎない。
直近関わったプロジェクトが、アカウントとなるモデルが３つありました。
adminとclientとsupplierのように３つあり、モデルそれぞれに違うページを用意する、というようなものでした。
はじめのrailsのイメージでは、adminとclientとsupplierのそれぞれのページは裏では同じソースファイルを参考してたほうがDRYで便利なはずだ！と思っていました。
が、全然違いました。
結局共通化しなくて胸をなでおろしているのですが、共通化してしまうとadminを変更しただけでclientとsupplierの動作チェックも必要になってしまうことになります。これはだるい。
自分は入出力が同じ場合（変数の値による違いしかない場合）のみ共通化しています。


# あなたとリファクタリングが手を取り合った未来

目の前の靄がかった景色が晴れ、
いつかのあなたに定時というプレゼントを。

ありがとうございました。
Excel VBAのRangeプロパティのパラメータの指定について

しばらくExcelマクロを作成する機会がなかった為、すっかり忘れてしまった。。
今回また、エクセルVBAを使う機会が来たので、あらためて学ぼうと思う。

#はじめに
　基本はセルの操作ということで
　１行のある範囲をCopyして他の行にPasteする。
　
　使用するExcel
　　Excel 2010

#１行のある範囲をコピーする
　　A1からE1の範囲コピーをする。
　　**Range("A1:E1").Copy**  
　　これは無事終了。

#コピーした内容をある指定したセルにペーストする
　　A2のセルにペーストする。（A2−E2に貼り付ける）
　　**1. Range("A2").PasteSpecial Paste:=xlPasteAll**
　　**2. Range(Cells(2,1)).PasteSpecial Paste:=xlPasteAll**
　　**3. Range(Cells(2,1),Cells(2,1)).PasteSpecial Paste:=xlPasteAll**
　　**4. Cells(2,1).PasteSpecial Paste:=xlPasteAll**  
　　1,2,3,4は正常。
　　 **2**だけエラーが発生した。

MSDNによると
>**構文
>式.Range(Cell1, Cell2)
> ...
>Cell1 必須
>Cell2 省略可能

（https://msdn.microsoft.com/ja-jp/library/office/ff836512.aspx より引用）

となっていたがCellsの指定では省略できないようだ。※1

※1 Excel 2016でも同じ結果となった。
プロジェクトマネジメント アンチパターンのまとめ

プロジェクトマネジメントのアンチパターン（Project Management Antipattern）をまとめた．
基本的に下記の本を邦訳した内容になっている．
[https://www.amazon.com/AntiPatterns-Refactoring-Software-Architectures-Projects/dp/0471197130]  

# プロジェクトマネジメントのアンチパターンって何？

* プロジェクトマネジメントのアンチパターンは鍵となるシナリオ集
    * ほっておくと破壊的な影響を及ぼす

<p></p>

* 現代のソフトエンジニアの仕事は，大半が人を相手にすること
    * コミュニケーション
    * 人間間の問題解決

<p></p>

* 技術系マネージャーの役割の変化
    * もともと
        * ルールに対する例外への承認
        * その手続き
    * 現代
        * マネージャーの干渉受けずに，問題解決できる
        * しかし以下のエリアでは役割が存続している
            1. ソフトプロセス管理
            2. リソース管理（人とITインフラ）
            3. 外部環境との関係管理

# ソフトウェア開発アンチパターン目次

アンチパターンとは，「やってはいけない例」を類型化したもののこと．
パターンごとに「どんな問題が起こるか？」や「どう解決するか？」をまとめてみた．

* [Blowhard Jamboree](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/11/000717)
* [Analysis Paralysis](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/11/202720)
* [Viewgraph Engineering](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/11/204551)
* [Death By Planning](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/11/221456)
* [Fear of Success](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/11/230427)
* [Corncob](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/12/212420)
* [Intellectual Violence](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/12/214721)
* [Irrational Management](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/13/001712)
* [Smoke and Mirrors](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/13/003609)
* [Project Mismanagement](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/13/224314)
* [Throw It over the Wall](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/13/234710)
* [Fire Drill](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/15/011326)
* [The Feud](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/15/011553)
* [Email Is Dangerous](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/15/011704)
【ゲリラアドカレ】UE4ゲーム実装　進捗報告 7日目(バトル画面ロジック実装　その3)

【非公式】某会社設立記念ゲリラ Advent Calendar 2016 15日目の記事です。

FlashゲームをUE4で再実装するゲリラアドカレです。

今回はバトルのロジックを組んでいきます。
味方の通常攻撃を途中まで実装したので、書いていきます。

・注意
許可を取ってないので通常業務の空いた時間を利用して作成するため、作成中のゲーム、及びアドカレは完成保証がなければ、ゲーム自体もリリースされる保証も皆無なので、あんまり期待しないでください。

#攻撃したらとりあえずHPを減らしてみる

最初に断ります。かなり汚いです。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/2733d27d-e19d-0e56-8b1a-ddfa1944c014.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/87905f88-09e4-db8a-61b8-d6b157fb2ee3.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/e4ee52af-6115-44b9-b5fe-a4f6fcdd45ef.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/1d119c98-a986-a30b-6d87-d66ef2c298c5.png)

実装途中なので、詳細な説明はこの部分がある程度、完成してからにします。
というより、実装している本人がバトルのロジック実装で結構頭がこんがらがってるので、説明がしにくいです。

気軽にロジックを試せるのはブループリントのいいところです……。

#とりあえず今回やったこと

・味方のコマンドを全て選択し終わったら、コマンドのリストを見て、敵のHPを減らす処理を実行する
・味方の攻撃値から敵の防御値を引く。その値がHPへのダメージ値
・敵が全て0ならクエストへ戻る

だけです。はい。
このままだと防御値が上回るとHPが回復するなどの色々な謎現象が起きるので、直しながら引き続きロジックを組みたいと思います。

今の段階になってマクロか関数にすればよかったんじゃないかなと思えてきました。
かなりきついですが、引き続き実装していきます。
Qiitaのスマホページで見出し一覧が一番下にあるのはおかしい


Qiita記事をスマホで見ると、記事の目次(`#`などで指定している段落のタイトル)がページの下の方に表示されてしまいます。
これでは目次としての機能が果たせません。
記事を一番下までスクロールしないと、目次が見れないのはいけないのは非常に使いづらいです。
requireとrequire_relativeとautoload

要はなんでautoload_relativeが無いの？って話です。
#requireとrequire_relative
あるスクリプトで、同じディレクトリのスクリプトをrequireしたいとき、よく

```rb
require './hoge'
```

または

```rb
require_relative 'hoge'
```

とします。
ただし両者は同じではなく、スクリプトのあるディレクトリ以外から実行したときに、requireのほうではカレントディレクトリを探してしまうので意図した結果になりません。
[リファレンスマニュアル](https://docs.ruby-lang.org/ja/2.3.0/method/Kernel/m/require_relative.html)によると、require_relativeは
>`require File.expand_path(relative_feature, File.dirname(__FILE__))`
>とほぼ同じです。

とあります。

#autoload
Kernel#autoloadまたはModule#autoloadは、ある定数が読み込まれたときに初めてファイルをrequireするように予約するメソッドです。
別ファイルにある、使うかどうかわからないクラスを必要なときだけ読み込むのによく使われます。

```rb
autoload :Hoge, './hoge'
Hoge.new #このタイミングで./hoge.rbが読み込まれる
```

ただリファレンスマニュアルによると、読み込むときに使われるのはKernel#requireなので、`'./hoge'`という書き方は上に書いたのと同じ問題があるわけです。回避策としては

```rb
autoload :Hoge, File.expand_path('hoge', File.dirname(__FILE__))
```

とするか、ロードパスにディレクトリを追加するかの2つです。
~~どっちもめんどくさいですね~~

やっぱり、require_relativeがあるならautoload_relativeもあるべきだと思うんです(´・ω・`)
なので誰かruby-coreに提案してください(丸投げ)
とにかくさっさとgit pushしたい人向け関数(タイムスタンプ付き)

```sh
function fastgitpush (){
	echo "git add"
	`git add -A`
	git commit -m "`date +'%Y%m%d%H%M%S'`" #YYYYMMDDhhmmss
	git push
}
```
ソフトウェア開発 アンチパターンのまとめ

ソフトウェア開発アンチパターン（Software Development Antipattern）をまとめた．
基本的に下記の本を邦訳した内容になっている．
https://www.amazon.com/AntiPatterns-Refactoring-Software-Architectures-Projects/dp/0471197130

# ソフトウェア開発アンチパターンって何？
* システムの拡張性と保守性の向上のために，良いソフトアーキテクチャが必要
    * ソフト開発は混沌とするため，実装されたものは計画とかけ離れてしまう．
    * リファクタリングが効果的となる．
        * ソフト開発のアンチパターンが有用となる．
        * それぞれのアンチパターンで，リファクタリング方法を解説している

# ソフトウェア開発アンチパターン目次

アンチパターンとは，「やってはいけない例」を類型化したもののこと．
パターンごとに「どんな問題が起こるか？」や「どう解決するか？」をまとめてみた．

* [The Blob](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/03/173401)
* [Continuous Obsolescense](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/04/002140)
* [Lava Flow](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/04/102046)
* [Ambiguous Viewpoint](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/04/170731)
* [Functional Decomposition](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/04/181258)
* [Poltergeists](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/05/221759)
* [Boat Anchor](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/05/223903)
* [Golden Hammer](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/06/224700)
* [Dead End](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/03/111529)
* [Spaghetti Code](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/07/215836)
* [Input Kludge](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/07/231959)
* [Walking Through a Minefield](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/08/193617)
* [Cut-And-Paste Programming](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/08/224408)
* [Mushroom Management](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/09/103158)
Thymeleaf × SpEL でテンプレート上で List を定義する方法

SpringBoot × Thymeleaf のWeb開発で、テンプレート上で List の要素に値が含まれるかなどのチェックをしたいケースがある。

```html
<div th:if="${#lists.contains(lists, element)}"> ...
```

的なやつ。

上の例の "lists" をテンプレート内で定義したかったけど、意外とうまく行かなかったのでメモしておく。

## 前提
まず、Thymeleaf にはリテラルが次の種類しかない。
- テキストリテラル
- 数値リテラル
- 真偽値リテラル
- null リテラル

Thymeleaf のみでは List を定義することはできないみたい。

## SpEL の利用
"Spring Expression langage" 通称 SpEL で、Spring 版の EL式。
SpEL ではリテラルとして次のものなどが利用できる。
- strings
- dates
- numeric values (int, real, and hex)
- boolean
- null
- lists
- maps
- arrays

つまり List を定義できる。

List の定義は ```{'1', '2', '3'}``` と書ける。

## 結論
```html
<div th:if="${#lists.contains({'1', '2', '3'}, element)}"> ...
```
こう書ける。

スッキリ書けて良かった。

## 蛇足
実は JavaScript ライクに ```['1', '2', '3']``` と書こうとしたんだけど、これだと配列とかに使う ```arrays[0] ← これ ``` とぶつかるよね。
恥ずかしい。。。
ニフティクラウド + CoreOS + プライベート LAN で固定 IP をふる場合の注意点

[ニフティクラウドの CoreOS パブリックイメージ](http://blog.cloud.nifty.com/2756/) をプライベート LAN と組み合わせて利用し、プライベート LAN 側でプライベート IP を振りたい場合、ネットワークインタフェースの ens192 と ens224 のどちらがグローバルでどちらがプライベート LAN 側なのかを意識して cloud-config.yml を設定する必要があるようだった。

つまり、下記のように書くのが正しい場合と、

```
# /usr/share/oem/cloud-config.yml
coreos:
  units:
    - name: oem-ens192.network
      content: |
        [Match]
        Name=ens192

        [Network]
        Address=${IP アドレス}/${ネットマスク}
        Gateway=${ゲートウェイ}
```

下記のように書くのが正しい場合の 2 通りあるっぽい。

```
# /usr/share/oem/cloud-config.yml
coreos:
  units:
    - name: oem-ens224.network
      content: |
        [Match]
        Name=ens224

        [Network]
        Address=${IP アドレス}/${ネットマスク}
        Gateway=${ゲートウェイ}
```
今更だけどGoのVendoringについて思いをはせる

# はじめに
GoはWebAPI的に使っているもののあまりディープな話はできないなと思い、Vendoringについて調べて書いておこうって感じです。
ほとんど[PackageManagementTools · golang/go Wiki](https://github.com/golang/go/wiki/PackageManagementTools)を見て書こうとしているのでご存知の方はスルー願います。
また多くのパッケージ管理ツールは今回初めて触っているので認識が間違っていましたら記事の編集リクエストお願いします:bow:

# Vendoringについて
Go 1.5から試験的に導入された機能で1.6でデフォルトの機能となっています。
何らかの理由で1.5を利用しなければいけない場合は`GO15VENDOREXPERIMENT=1`と環境変数で設定する必要があります。
Goでは`/vendor`ディレクトリを利用して依存性解決を行なっています。
Rubyで言うとこの[Bundler](https://bundler.io/)やJSでいうところの[Yarn](https://yarnpkg.com/)、Pythonの[Pip](https://pip.pypa.io/en/stable/)を思い浮かべるとイメージしやすいかと思います。

# パッケージ管理ツール
パッケージ管理ツールは思っていたより多く、記事記載時に500Starを超えているもので比較していきます。
表の「グローバル汚染なし」（？）は`go get`によってGOPATH配下のグローバルな場所を利用していない場合は :white_check_mark: となります。これ本当はなんていうんだろう？

ツール名|Godep|Glide|Govendor|gom|manul
---|---|---|---|---|---
スター数(2016.12.14)|4,106|3,360|1,333|1,189|575
開発開始|2013.04.28|2014.06.06|2015.04.12|2013.09.08|2015.09.27|2015.08.30
グローバル汚染なし|:no_entry:|:white_check_mark:|:white_check_mark:|:white_check_mark:|:no_entry:
バージョン管理|Godeps/godeps.json|glide.yaml|vendor/vendor.json|Gomfile|git submodules
キャッシュ|GOPATHからコピー|:white_check_mark:|:white_check_mark:|:no_entry:|:no_entry:
[セマンティックバージョニング](http://semver.org/)|:no_entry:|:white_check_mark:|:white_check_mark:|:no_entry:|:no_entry:
グルーピング|:no_entry:|:no_entry:|:no_entry:|:white_check_mark:|:no_entry:

## Godep
Goが出て間もない頃から出ているので機能的にほかのツールに劣りますが、Go1.5未満でも動作するようです。

## Glide
一番多機能だと感じました。
セマンティックバージョニングが強力でマイナーバージョンの変更のみやパッチバージョンの変更のみアップデートすることができます。
他にも機能はたくさんあるようですが、複雑さはなく非常に使いやすいと思いました。

## Govendor
十分な機能を携えています。
GOPATHからとリモートネットワークを通じての両方でパッケージのインストールをできるのが特徴的だなと思いました。

## gom
唯一グルーピングができます。
Bundlerのtest,development,stagingのように使えて用途によってはかなりコンパクトなパッケージ管理ができると思います。

## manul
gitのサブモジュールを利用するという全く別のアプローチを採用しています。

# 終わりに
あまりGoを触れていないので間違っていたら恐縮ですが、この記事を見てパッケージ管理を再考するきっかけになっていただければと思います。良いGoライフを!!
Burp suite を使って iPhone アプリを診断した時に困ったことと、解決方法

# 概要

Webアプリケーション脆弱詩診断の業務に携わっています。
診断時に特定のドメインだけ通信が取れなくて困った事があったので、備忘録として残します。

（2019/04/09 追記）
時が経ち、有線LANに接続できるMacが手元にないので追記しました。

# スライド

2016/11/18 に、Burp Suite Japan LT Carnival に登壇させていただいたときの資料になります。
こちらもどうぞご覧ください。
[Burp suite を使って iPhone アプリを診断した時に困ったことと、解決方法](http://www.slideshare.net/tobaru_yuta/burp-suite-iphone)

# 通信が取れなくなった原因

プロキシ設定が無視されてるのではと考えていますが、特定できず…

# 解決方法

Macの機能を使いました。

## インターネット共有

1. Macを有線LANに接続
2. システム環境設定 > 共有 > インターネット共有 > Wi-Fiの設定 > インターネット共有開始
3. iPhoneからMacに無線LANで接続

### 有線LANへ接続できない場合、モバイルルーターのUSBテザリング機能で代替可能でした。

検証時の環境は下記です。

- PC
  - MacBook Pro 15インチ 2015
- モバイルルーター
  - [Aterm MR05LN](http://www.aterm.jp/product/atermstation/product/mobile/mr05ln/)

手順は下記です。

1. Aterm MR05LN の設定を変更します。<br>
   設定 > LAN側設定 > USBテザリング機能OFF→ON でテザリング機能を有効化できました。
2. PC と Aterm MR05LN をUSB接続して、テザリングします。
3. システム環境設定 > 共有 > インターネット共有 > Wi-Fiの設定 > インターネット共有開始
4. iPhoneからMacに無線接続

※CatalinaでUSBテザリングができない場合、Mac側にドライバが必要かもしれません。
[HoRNDIS: USB tethering driver for Mac OS X | Joshua Wise's domain](https://joshuawise.com/horndis) の HoRNDIS-9.2.pkg をいれたら動きました。

※USBテザリングで追記。
Catalinaだとインストール途中でエラーを吐くようになったので、下記を使っています。（Big Surでは使えないようなので注意）
[HoRNDIS-9.2-catalina_install.pkg.zip](https://github.com/jwise/HoRNDIS/files/3719733/HoRNDIS-9.2-catalina_install.pkg.zip)

※USBテザリングで追記。その２。
Big Surの場合は下記を参照のこと
[Big SurにアップデートしたHoRNDISを再インストールする](https://gatolynx.tokyo/geek/bigsur-horndis/)

## パケットフィルタ

設定ファイルを作成します。

```pf_burp.conf
rdr inet proto tcp from any to port 80 -> 127.0.0.1 port 8080
rdr inet proto tcp from any to 診断対象のIPアドレス port 443 -> 127.0.0.1 port 8080
rdr inet proto tcp from any to any port 443 -> 127.0.0.1 port 8081
```

ターミナルからパケットフィルタを起動します。

```
% sudo pfctl -ef pf_burp.conf
```

あとはBurpを3つ起動して通信を取得するだけです。

|#|port|os|備考|
|---|---|---|---|
|Burp1|8081|Mac|診断対象外<br/>SSL Path Throughで通信を取得しない|
|Burp2|8080|Mac|診断対象<br/>Burp3に通信をリダイレクト|
|Burp3|8080|Win|通常通り診断|

# 参考リンク

- PF 設定方法
  - [Mac OS X (yosemise)でBurp Proxyを使ったWi-Fi 透過型Proxyを作る](http://qiita.com/watarin/items/ca845c95843c5a52a7a6)
- MessagePack の 拡張機能
  - [Burp Extension開発 - MessagePack](http://io.cyberdefense.jp/entry/2016/05/13/Burp_Extension%E9%96%8B%E7%99%BA_-_MessagePack)
- USBテザリング
  - [USBテザリングって便利だね](https://qiita.com/hnk1031/items/f4c54a2412ab47b0303f)
  - [macOS 10.15 CatalinaでAndroidスマートフォンとUSBテザリングする方法・注意点 | きなこぱん](https://kinakopan.com/blog/2020/01/23/mac-os-10-15-catalina-android-usb-tethering/)
Groongaのbetween()関数の改善点

[Groonga Advent Calendar 2016](http://qiita.com/advent-calendar/2016/groonga) 14日目は、Groonga 6.1.1での`between()`関数の改善点を取り上げます。

## `between()`とは？

[`between()`関数](http://groonga.org/ja/docs/reference/functions/between.html "7.14.1. between — Groonga v6.1.1ドキュメント")はその名の通り、値の範囲を示します。`select`コマンドの`--filter`オプションで指定する検索条件に記述すると、第1引数に指定されたカラムの値が第2引数以降で指定された範囲内に収まっているレコードだけを取り出すことができます。

Groonga 6.1.0までのバージョンでは`between()`の第1引数には`_key`*以外*の任意のカラムを指定する必要があり、`_key`に対する範囲指定での検索はできない仕様でした。Groonga 6.1.1ではこの点が改善され、`_key`が整数または日時のテーブルであれば、`_key`も対象のカラムに指定できるようになりました。

## 準備

実際の動作を見てみましょう。実験用のテーブルとして、主キーが時刻であるテーブル（ここでは例として、Webページの閲覧履歴を想定したテーブルにしてみました）を用意します。

~~~bash
$ cat dump.grn
table_create History TABLE_PAT_KEY Time
column_create History url COLUMN_SCALAR ShortText
column_create History title COLUMN_SCALAR ShortText
table_create Terms TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram --normalizer NormalizerAuto
load --table History
[
["_key","url","title"],
[1481799732,"http://example.org/","This is test record 1!"],
[1481799755,"http://example.net/","test record 2."],
[1481799811,"http://example.com/","test test record three."],
[1481799915,"http://example.net/afr","test record four."],
[1481800003,"http://example.org/aba","test test test record five."],
[1481800013,"http://example.com/rab","test test test test record six."],
[1481800204,"http://example.net/atv","test test test record seven."],
[1481801705,"http://example.org/gat","test test record eight."],
[1481803448,"http://example.com/vdw","test test record nine."]
]
column_create Terms history_title COLUMN_INDEX|WITH_POSITION History title
column_create Terms history_url COLUMN_INDEX|WITH_POSITION History url
$ rm -rf /tmp/groonga-databases
$ mkdir -p /tmp/groonga-databases
$ groonga -n /tmp/groonga-databases/introduction.db quit
$ cat dump.grn | groonga /tmp/groonga-databases/introduction.db
~~~

## 実際の動作

それでは早速試してみましょう。`--filter`に`between(_key, 1481799800, "include", 1481800000, "include")`という検索条件を指定して検索してみます。

~~~bash
$ groonga groonga-databases/introduction.db \
    select --table History \
           --filter '"between\(_key, 1481799800, \"include\", 1481800000, \"include\"\)"' |
    jq .
[
  [
    0,
    1481800116.779398,
    0.001013755798339844
  ],
  [
    [
      [
        2
      ],
      [
        [
          "_id",
          "UInt32"
        ],
        [
          "_key",
          "Time"
        ],
        [
          "title",Groonga 6.1.1での`between()`関数の改善点
          "ShortText"
        ],
        [
          "url",
          "ShortText"
        ]
      ],
      [
        3,
        1481799811,
        "test test record three.",
        "http://example.com/"
      ],
      [
        4,
        1481799915,
        "test record four.",
        "http://example.net/afr"
      ]
    ]
  ]
]
~~~

無事、主キーの時刻が指定の範囲内に収まっているレコードだけが検索されました。もちろん他の検索条件との併用も可能です。

以上、[Groonga Advent Calendar 2016](http://qiita.com/advent-calendar/2016/groonga) 14日目としてGroonga 6.1.1での`between()`関数の改善点ついて述べました。引き続きGroonga Advent Calendarをお楽しみ下さい！
バージョン確認(ubuntu)

``` sh:.zshrc
function version_check (){
	echo "バージョン情報を表示します。"
	echo ""
	echo "`cat /etc/lsb-release | grep -Po '(?<=")[^",]+(?=")' `(`arch`)"
	echo "zsh : `zsh --version`"
	echo "tmux: `tmux -V`"
	echo "vim : `vim --version | grep '^VIM'`"
}
```
ubuntuのバージョンのところは無理にワンライナーにすることなかったかも
今後はもう少し見やすくする
jr: jq-like JSON processor for Rubyists

## こんにちは

* Twitter: [@yuya_takeyama](https://twitter.com/yuya_takeyama) / GitHub: [@yuya-takeyama](https://github.com/yuya-takeyama)
* Web Dveloper at Quipper
  * Recruit グループです
  * 正確には Recruit Marketing Partners (RMP) の子会社
  * 主に Rails やりつつフロントエンドもやってます
* 積極採用中です
  * [Web Developer](https://t.co/THVQX3YDeX)
  * [iOS Developer](https://t.co/P4ZiGo7c0a)
  * [UI Designer](https://t.co/Oiw5FDlDtT)

---

## まずは jq の紹介

---

## jq

* JSON を pretty print したり
* map/filter 的な操作をコマンドラインで行う
* 便利

---

## jq で不便なところ

---

## ちょっと複雑なことをやろうとすると途端に面倒になる

---

## ちょっと複雑なこと

* reduce 的な集約処理
  * 一応できるけど専用の記法とか関数とかいちいち覚えてられない
* モジュールシステム
  * 1.5 ぐらいで実装された
  * 個人的には document 一見して面倒になったので実は使ったことがない (すいません)

---

## Ruby でできたくない?

---

## できるようにしてみた

---

## jr

---

## Basic mechanism of jr

```rb
json_enumerator.instance_eval do
  # Your jr filter runs here
end
```

* JSON を yield する `Enumerator`
* メソッドチェインでなんでも繋げられる
* 結果は勝手に出力される

---

## jr の便利なところ

* Ruby で書ける
  * 独特の記法を覚える必要がほぼない
* RubyGems が使える
  * `--require` オプションを使う
* jq のオプションもいろいろ移植している
  * `--raw-output`: JSON でなく生の文字列として出力 (sed/awk/grep とかに渡すのに便利)
  * `--unbuffered`: tail とかからパイプして JSON のログを眺めるのに便利
  * `--raw-input`, `--monochrome-output` などなど

---

## pretty print するだけなら jr の方が短く書ける！！！１１１

* jq: `cat foo.json | jq .`
* jr: `cat foo.json | jr`

---

## jr の不便なところ

* 単純な map なら jq の方が簡単
  * jq: `jq '.foo'`
  * jr: `jr 'map(&:foo)'`
* シングルバイナリではない
  * mruby とかにするとどうだろう? RubyGems は使えなくなる?

---

## gem i jr-cli

---

## その他使い方: http://qiita.com/tags/jr

---

## Fork me https://github.com/yuya-takeyama/jr

---

## Thank you!
自己流 WebDesign 5箇条


色々な思想はあると思うけど、自分がコーディングするときに気を付けたり、発注する際にお願いする事など。
命令形になってるけど、ほぼ自戒。

1. タグの意味を知れ
2. position は使うな
3. 動作以外の目的で JavaScript は使うな
4. ラベル等に画像を使うな
5. CSS をベタ書きするな

## 1. タグの意味を知れ
最も忌避される事例はテーブルレイアウトだろう。
「ホームページ」百家争鳴な時期においては Table タグを利用したデザインが主流だった。
かくいう自分もお世話になったわけだけど、そもそも Table はデータを入れるものだ。
それ以外は使うべきではない。

dl,dt,dd タグもよく横並びのために使われていたりするけど、本来はデータ定義につかうべきものだ。
div タグによる隙間作成もやめてほしい (margin,padding で済むならそれでやるべし)。
タグはデザインのためにあるわけではないのだ。

見た目が良ければいい？
もちろんそれもありだが、検索順位とプログラマからの評価は期待しない事だ。

## 2. position は使うな
後からデザインを調整するときに泣かされるのがこれ。
画面上の表示位置と、 HTML 上の位置が異なるため、なかなか直すのが大変だ。
ブラウザのデバッグツールで追跡すればすぐに位置は判明するが、あっち行ったりこっち行ったりして忙しいのはなるべく避けたいところ。

今ではそうでもないけど、ブラウザ間の微妙な誤差により上手く表示されないことも多々。
JavaScript で動作を追加する際なんかも、しばしば調整が手間取る原因になる。

[float+clear] もそれはそれで、 after 擬似要素の問題を孕むけど、 position よりかは HTML 上で追跡しやすいと思っている。

もし利用するならば管理台帳を作った方がいい。
メンテ時にも役立つし、どれだけ position に依存しているかも見えるだろう。

## 3. 動作以外の目的で JavaScript は使うな
Angler に喧嘩を売るつもりはないけど、 HTML 上に存在しないのに画面表示されている要素のデバッグは面倒な場合が多い。
HTML/CSS やサーバサイドで済むことはなるべくそこで終わらせるのが無難。
ただ、遅延ロード目的ならば、ユーザ体験向上のために必要と思っている(もちろん何でもかんでもやればいいということでもない)。

特にコーディングはデザイナがやって、動作はプログラマが並行して作成して後から合わせる場合なんかは色々な不具合を産みやすい。
デザイナが DOM 読み込み後に JavaScript で高さを調整する仕組みを導入していたために、そのページに画像カルーセルを実装したら取締役の写っている画像が画面外にぶっ飛んでいった、なんてこともあった。
それはそれで美味しいが、納品はできない。

## 4. ラベル等に画像を使うな
見た目は画像の方が断然良いのはわかるのだが、メンテナンス性が下がってしまう。
文字だったら修正も追加も楽ちんだ。
ブラウザ上でコピペもできる。
SEO 対策的にも文字の方が良いという話も (alt があれば問題ないという意見も聞くが、 Google の中の人じゃないので不明) 。

コーポレートサイトのリンク変更作業をした際、サイト自体は別な業者が作ったものだったためアイコンなどを作成した ai データがなく、たった数文字編集するためにサイト内全部のボタンを差し替えるという苦行を強いられたことがある。
さらに CSS の調整も必要になったため (background-image,:hover)、費用対効果も疲労度も最悪だった。

## 5. CSS をベタ書きするな
デザインの記述はなるべく分散させず、一つのファイルに集約されていると後から編集しやすい。
タグには data-* なども含め色々なエレメントを書く場合があるし、なるべく頭でっかちにしない方が可読性も上がる。
主役はタグの中身なのだ。

jQuery3 あたりからはタグに直接書かれた display:none を show() で表示できない、なんてこともあったりする。
Python で、ファイルからグラフ描画するまで。初歩の初歩


`sin` とか `cos` とか、どーでもいいから、取り敢えず単純に外部データをプロットさせたいんだよ!

ってメモ

## 描画対象

ランダムに 100 個の値を羅列したもの。

```shell-session:A
$ perl -le 'print rand (10) for 0 .. 99' > rand.txt
```


## matplotlibのみ

A 実行後、同じディレクトリで↓実行

```python:
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
f = open("rand.txt", "r")
x = []
y = []
for i, line in enumerate(f):
    x.append(i)
    y.append(float(line))
plt.title("data")
plt.xlabel("x")
plt.ylabel("y")
plt.plot(x,y)
plt.savefig("graph.png")
```



## pandas使ったら

同様に。

```python:
import matplotlib
matplotlib.use('Agg')
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv("rand.txt", header=None)
data.columns= [ 'test' ]
data.plot()
plt.savefig("graph.png")
```

![graph.png](https://qiita-image-store.s3.amazonaws.com/0/64084/8b736b87-6ea4-4a18-273b-e26a773496b7.png "graph.png")
SSLアクセラレータ導入前調査

## SSLアクセラレータとは
SSL関連の処理（SSLハンドシェイク、および、アプリケーションデータの暗号／復号）を高速化するための機器のこと。
## SSLアクセラレータの導入目的
・WEBサーバのSSL負荷軽減
・アプリケーション側のSSL対応コスト削減
・WEBサーバのSSL対応コスト削減

参考：SSLアクセラレータの必要性
http://www.fujitsu.com/jp/products/network/security-bandwidth-control-load-balancer/ipcom/material/data/ssl/index.html

## 前提条件
インフラ環境はクラウド化していない。物理サーバ構成。
## SSLアクセラレータの選定
・アプライアンス型
・自作
（※カード型は各WEBサーバに設置が必要となるため除外）
### アプライアンス型
ベンダーが提供するSSLアクセラレータ専用機器。
SSLアクセラレータとして必要な機能がすべて搭載しており、ハード構成も特化したものとなっているため大量のトラフィックに対しても安心。
また、機器に対して保守もあるため運用面で安心。

#### 機器候補
・日立ソリューションズ：ArrayAPVシリーズ
http://www.hitachi-solutions.co.jp/array/sp/apv/about.html
貸し出しサービスがあり、検証してから購入が可能

・セイコーソリューションズ：NetWiserシリーズ
http://www.seiko-sol.co.jp/products/loadbalancer/loadbalancer_lineup/loadbalancer_sx3840/

#### 自作
Nginxなどオープンソースのリバースプロキシ機能とSSL対応モジュールを利用してSSLアクセラレータを構築する。
好きなハードウェアやミドルウェアを組み合わせることができるため、最低限の構成で始めることができ、今後の負荷状況に応じて柔軟に対応しやすい。
その反面、運用の負担が大きい。

参考記事
http://snickerjp.blogspot.jp/2015/03/nginx-ssl-accelerator.html

今回、本番環境、検証環境、別ネットワーク環境などSSLアクセラレータが分散かつ複数台必要となるため、できれば自作で進められるとコストパフォーマンスは良い。

## SSLハンドシェルクの負荷対策
SSLハンドシェイクのコストは高い。通常のhttp通信に比べるとhttpsの通信はかなりコスト高となる。
その対策として2回目以降の通信はハンドシェイク処理を省略させるべく、SSLセッションを利用する。
SSLアクセラレータをスケールアウトする場合を考慮し、SSLセッションは共有化しておく。
### 共有化の方法の検討
#### 方法1：サーバ内のセッションキャッシュを他サーバ同士で共有する
各SSLアクセラレータサーバに保有するSSLセッションキャッシュを他のアクセラレータサーバから参照し合う仕組み。
懸念点は、スケールアウトするほどセッションキャッシュの同期コストが高くなる。

参考：SSLセッションキャッシュを共有したいだけだった
https://speakerdeck.com/nojima/sslsetusiyonkiyatusiyuwogong-you-sitaidakefalseren-sheng-datuta
参考：細かすぎて伝わらないSSL/TLS (分散された Server の cache の共有)
https://techblog.yahoo.co.jp/infrastructure/ssl-session-resumption

#### 方法２：SSLセッションキャッシュ共有の専用キャッシュサーバを用意する
1つのセッションキャッシュサーバに、全てのセッションをキャッシュさせて共有する。
懸念点は、セッションキャッシュサーバ自体の運用コストがかかること。
また、キャッシュサーバへのトラフィックが集中することで、キャッシュサーバ自身のスケールアウトが必要となった際に、キャッシュの同期について考慮が必要となる。

方法2は構成自体が複雑になるため、できれば方法1で進めたい。


#### 別の方法：セッションチケットを利用
セッションチケットを利用すると、クライアント側にセッションをキャッシュさせることができる。
スマホに対応できない場合もあるという情報もあり要調査。

参考：細かすぎて伝わらないSSL/TLS （TLS Session Ticket 拡張（Transport Layer Security（TLS）Session Resumption without Server-Side State））
https://techblog.yahoo.co.jp/infrastructure/ssl-session-resumption


Amazon CloudFrontなどクラウドサービス環境ではセッションチケットに対応している場合もある。
インフラがAWSやAZULなどの環境下であれば悩みも少しは減るだろう。。
Swift.Any as? CFType

Objective-C の API を Swift から使うとき、次のようにオプション項目を Dictionary 型で指定することがよくある。

```swift
open class AVPlayerItemVideoOutput : AVPlayerItemOutput {

    public init(pixelBufferAttributes: [String : Any]? = nil)

}
```

普通に Swift 側から API に値を投げる分には何も問題ないのだけど、自分で `Any` から `CoreFoundation` 由来の型にキャストする場合にちょっと手間取った。具体的には、↑ の API に渡される `[String : Any]` の `Any` を `CFAllocator` として取り出したい。

## 普通に as? でキャストすればいいのでは？

<img width="780" alt="Screen Shot 2016-12-15 at 17.22.51.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/122609/7fdb0c0c-e435-e297-3e30-746262c5424a.jpeg">

🤔
これならわかる:

<img width="778" alt="Screen Shot 2016-12-15 at 19.03.40.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/122609/54c8c336-f587-9f1a-6e42-fada08dec955.jpeg">

同じ `CoreFoundation` 由来の型でも `CFString` や `CFNumber` は Swift の `String`  や `Int` などに `as` で安全にキャストできるので、特に困ることはない。

```swift
let value: Any? = "🤔"

guard let string = value as? String else { return }

let cfString = string as CFString
```

ただ `CFAllocator` などは対応する Swift や Objective-C の型がないので、何かしら別の手段で型をきちんと確認してから `as!` でキャストすることになる。

## CFGetTypeID(_:) で型をチェックする

というわけで:

```swift
let value: Any? = attributes[kCVPixelBufferMemoryAllocatorKey as String]

let allocator: CFAllocator?

if CFGetTypeID(value as CFTypeRef!) == CFAllocatorGetTypeID() {
    allocator = (value as! CFAllocator)
} else {
    allocator = nil
}
```

これで `Any` から `CFAllocator` にキャストすることができた。 [`CFGetTypeID(_:)`](https://developer.apple.com/reference/corefoundation/1521218-cfgettypeid) へは Swift の型を投げ入れても例外で止まるようなことはないので、型の一致判定に使う分には問題無さそう。

## 参考
https://forums.developer.apple.com/thread/11171
Bluemix Infrastructure(旧SoftLayer) で、従来IDをIBMidに切り替える

この記事は、Bluemix(SoftLayer) Advent Calendar 2016 の15日目の記事です。
http://qiita.com/advent-calendar/2016/bluemix

# はじめに

2016年11月上旬から、Bluemix Infrastructure(旧SoftLayer)の管理ポータル画面にログインすると、下記のようなポップアップが出るようになりました。

![ibmid01.png](https://qiita-image-store.s3.amazonaws.com/0/59627/09b3197f-5f43-e103-805e-ee9a343e94db.png)

これは、ログインするための認証情報として、従来のユーザーIDに代わり、IBMidが使われる事になったための移行措置です。IBMidを使う事で、従来からあるBluemix(PaaS)と共通のIDでログインできたり、アカウントをリンクさせることで、同じ管理画面内でIaaSとPaaSの両方を使えるようになります。
なお、現在、新規にBluemix Infrastructureのアカウントを開設すると、最初からIBMidが使われるようになっています。
https://www.change-makers.jp/docs/softlayer-config-guide/10290

今のところは何となくLaterを押して、先送りにしている方もけっこう多いのではないでしょうか。今後、IBMidが主流になっていくと思われますので、切替方法を確認したいと思います。


# 既存IBMidまたはメールアドレスの入力

上記のポップアップで「Switch Now」を押下すると、既存IBMidまたはメールアドレスを入力する画面が表示されます。
デフォルトでは、今ログインしているBluemix Infrastructureのアカウントに紐づいたメールアドレスがセットされていますが、書き換える事も可能です。
入力後、Submitボタンを押下します。（今回は既存のIBMidを入力しました）

![ibmid02.png](https://qiita-image-store.s3.amazonaws.com/0/59627/3f25fc8f-9df1-d6c0-2f03-0c8ee8574f88.png)

※一度Laterを選ぶと、再ログイン時にも一定期間、ポップアップは出なくなるようですので、Switchしたいのにポップアップが出ない！という場合は、メニューの「アカウント」＞「ユーザー」＞各ユーザーのプロファイル編集ページ　から、「Switch to IBMid」ボタンを押すと、同じ画面が表示できます。
![ibmid03.png](https://qiita-image-store.s3.amazonaws.com/0/59627/846c6310-67eb-c511-4442-b1fd3ec8bc31.png)

# 届くメールのリンクをクリックして有効化

上記でSubmitを押すとすぐに、入力したメールアドレスにメールが届きます。

件名：　Action Required! Complete your IBMid - SoftLayer identity link

メール内にある、「Switch to IBMid」のリンクをクリックすると、IBMidとBluemix Infrastructureアカウントの紐づけ処理が完了し、かつ、IBMidのログインページが開きます。（もし、既にIBMidでログイン済みだった場合はそのままBluemix Infrastructureの管理ポータル画面に遷移します）

![ibmid04.png](https://qiita-image-store.s3.amazonaws.com/0/59627/35fc87b0-d6e6-ac21-7575-5837ce13541d.png)

![ibmid05.png](https://qiita-image-store.s3.amazonaws.com/0/59627/50570e50-92dc-6fff-1d34-dd56524b139f.png)


IBMidのパスワードを入力すると、ログインが完了し、いつものBluemix Infrastructureの管理画面が表示されます。

![ibmid06.png](https://qiita-image-store.s3.amazonaws.com/0/59627/b71ba8a9-8884-4f42-0d8d-15fa124e8fd2.png)

![ibmid07.png](https://qiita-image-store.s3.amazonaws.com/0/59627/70193513-cf02-947c-18cd-5cbc15ca9a6f.png)

以上で、従来IDのIBMidへの切り替えは完了です。
DynamoDBをDockerにしてローカル上でお手軽に動かす

[DynamoDBLocal](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DynamoDBLocal.html)というものをAmazonが配ってくれいているのですが、ちょっと扱いにくいのでDockerにしてしまいました。
https://github.com/narikei/dynamodb-local-docker

Dockerfileはこんなかんじで、
javaをインストールして、dynamodbをダウンロードして、それを動かしているだけです。

```text:Dockerfile
FROM ubuntu:16.04

# apt-get install
RUN apt-get update
RUN apt-get install -y wget
RUN apt-get install -y openjdk-8-jdk
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64

# get dynamodb
RUN mkdir /usr/local/dynamodb
RUN cd /usr/local/dynamodb && \
    wget http://dynamodb-local.s3-website-us-west-2.amazonaws.com/dynamodb_local_latest.tar.gz && \
    tar zxvf dynamodb_local_latest.tar.gz

# start
RUN mkdir /usr/local/dynamodb/db
CMD ["java", "-Djava.library.path=/usr/local/dynamodb/DynamoDBLocal_lib", "-jar", "/usr/local/dynamodb/DynamoDBLocal.jar", "-dbPath", "/usr/local/dynamodb/db"]
EXPOSE 8000
```

## Dockerを起動
ローカルの`8080`ポートで動作するようにします。

```bash
$ docker build -t dynamodb-local .
$ docker run -d -p 8080:8000 dynamodb-local
```

## 確認
疎通できればOK

```bash
$ aws dynamodb list-tables --endpoint-url http://localhost:8080
{
    "TableNames": []
}
```
VisualStadio でツールボックスにコードを保存する方法

便利だったのでメモ書き

１．コード上でコピーし、ツールボックスを開いて貼り付け
２．貼り付けたコードを名前変更しわかりやすい名前へ
    ※名前内にコードが見えるが、単なる名前なので消しても問題ない。

こうしておくと、ツールボックスからコントロールを貼り付けるようにソースコードを貼り付けることができる。
Dockerのインストールをしてみた。


##背景
Go言語を使ったプログラムをローカル環境で実装。
そのプログラムを本番環境にアップしたところ環境の違いで、正常に動作しなかった。
その度に本番環境に合わせて手直しを行っていたら2度手間。
それならローカル環境で、本番環境と同じような環境状態にしてから実装したらいいんじゃね？ということでDockerを使うことになりました。

また、Dockerを使ったらどのPCでも同じ環境をすぐにセットすることができるのでセットアップがとても楽です。

###~Dockerを使う理由~
Dockerの特徴として、開発環境が立ち上げることや消すことが容易で、本番環境に近しい状態を構築していく上で、とてもやりやすい。

##目次
1.VirtualBoxとVagrantをインストール
2.Vagrantにboxをインストール
3.boxにDocerをインストール

##1.VirtualBoxとVagrantをインストール
公式サイトから[VirtualBox](https://www.virtualbox.org/) と [Vagrant](https://www.vagrantup.com/) をそれぞれインストールします。

##2.Vagrantにboxをインストール
VM(VirtualMachine)用のディリクトリを作成

```
$ mkdir vm
$ cd vm
```

boxのインストールを行います。

```
$ vagrant box add [box-name] [box-url]
```

box-name - Box名 (名前は何でもよいです。)
box-url -  http://www.vagrantbox.es/ を参考にインストールしたいOSを選択してください。


例としてcentos-7.2をインストールします。

```
$ vagrant box add centos64 https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.2/vagrant-centos-7.2.box
```


vagrant初期化

```
$ vagrant init centos64
```

仮想マシンを起動する

```
$ vagrant up
```

仮想マシンに接続を行う

```
$ vagrant ssh
```

仮想マシンからログアウトしたい時は

```
$ exit
```


##3.Dockerのインストール
https://www.docker.com/products/overview#/h_installation
OSを選択して、公式サイトにしたがってインストールしてみましょう

Versionが確認できたら成功です。

```
$ sudo docker --version
Docker version 1.12.4, build 1564f02
```

参考
・http://dotinstall.com/lessons/basic_docker
・http://qiita.com/hidekuro/items/fc12344d36d996198e96
・http://qiita.com/skinoshita/items/57ac059ff8b1008f5e1d
SSHからログアウトした後もプロセスを起動しておく方法

SSHでリモートに接続して，SSHの接続を切った後もプロセスを回し続けたいという場面があります。
私の場合は，リモートのGPUマシンに接続して機械学習のモデルを学習させたいときがこれにあたります。

# nohup
nohupコマンドを使うと，stdout/stderrへの出力をファイルに書き出すことができます。

```
$nohup <command> &
```

`<command>`の部分には実行したいコマンドを入れます。例えば`python3 train.py`を実行し続けたい場合，

```
$nohup python3 train.py &
```

とするとSSH接続を切ったあとも学習を続けられます。

# screen
screenコマンドは実行画面をセッションとして残しておくことができます。
nohupと同じようにコマンドを引数として渡すと実行が開始され， Ctrl-A → D で画面から抜け出すことができます。
この状態でSSH接続を切ってもプロセスは実行され続けます。

```
$screen python3 example.py
[detached from 12689.pts-4.user]
$exit
Connection to localhost closed.
```

SSHに再接続したら，`screen -ls`で復帰したい画面を選ぶことができます。

```
$ssh remote
$screen -ls
There are several suitable screens on:
	12762.pts-4.user	(12/15/2016 07:05:42 PM)	(Detached)
```

画面を選んで再接続すれば実行画面にもどれます。

```
$screen -r 12762
[detached from 12762.pts-4.user]
```
今年が何割終了したかを Date() に教えてもらう

2016年ももう95%は終わったようですねって簡単に言えるようなエクステンションを書きました。

必要だと思って書いたものの実はいらないってわかって…。とは言えせっかく書いたので勢いに任せて残しておきます。あんまりテストしてないのでバグがあったらごめんなさい。

```swift

// パーセント

extension Date {

    /// 今日が何パーセント進んだか
    var progressInDay: Double {
        return progress(inComponents: [.year, .month, .day])
    }

    /// 今月が何パーセント進んだか
    var progressInMonth: Double {
        return progress(inComponents: [.year, .month])
    }

    /// 今年が何パーセント進んだか
    var progressInYear: Double {
        return progress(inComponents: [.year])
    }

    /// 今週が何パーセント進んだか
    var progressInWeek: Double {
        return progress(inComponents: [.year, .month, .weekday, .weekOfYear])
    }

    /// Component を元に経過割合を算出
    private func progress(inComponents components: [Calendar.Component]) -> Double {
        let calendar = Calendar(identifier: .gregorian)
        var start = calendar.dateComponents(Set(components), from: self)

        guard let targetComponent = components.last else { return 0 }

        if targetComponent == .weekOfYear {
            // 開始曜日に合わせて調整（微妙感あるが…）
            start.weekday = 1 // 月曜開始の場合
        }

        guard let startDate = calendar.date(from: start),
            let endDate = calendar.date(byAdding: targetComponent, value: 1, to: startDate) else { return 0 }

        return self.timeIntervalSince(startDate) / endDate.timeIntervalSince(startDate)
    }

}

```
ebay（イーベイ）のAMP対応状況について調べてみた。


AMPについて、インターネット上にも情報が少ないので、調べたことをどんどん発信していこうと思います。その第三弾です。

第一弾：[楽天レシピのAMP対応状況について調べてみた。](http://qiita.com/i3mato/items/d43f77121f859beacc58)
第二弾：[ゾゾタウンのAMP対応状況について調べてみた。](http://qiita.com/i3mato/items/30fcd9a3f95d56728625)

今回は、海外の大手オークションサイト「ebay（イーベイ）」のAMP対応状況についてです。
おそらくECサイトで最もAMP対応が進んでいる事例なので、ECサイトでAMPの実装を考えている方は、是非参考にしてみてください。
実際に通常ページとAMPページを見比べると、そんなことまでAMPでできるの？！という発見があると思うので、是非。
ちなみに、AMP対応は商品一覧のみと特殊です。

## AMP対応状況
| ページ名 | 通常ページ | AMPページ |
|:-----------|------------:|------------:|
| トップ     | http://m.ebay.com/ |     未対応     |
| 商品一覧       |    http://m.ebay.com/sch/Cell-Phones-Smartphones-/9355/i.html |     http://m.ebay.com/sch/amp/Cell-Phones-and-Smartphones/bn_320094/i.html    |
| 商品詳細      | http://m.ebay.com/itm/272485081923  |     未対応     |

## AMP対応時期
[ebay公式ブログ](https://www.ebayinc.com/stories/news/experience-the-lightning-bolt/)によると

2016年6月：AMPページを実装
2016年9月日：AMPページが検索結果に表示



## AMPページ確認方法

/sch/の下に/amp/を入れることで確認できます。ただし商品一覧ページ限定です。

AMP対応が進んでいるニュースサイトでもレシピサイトでも他のECサイトでも商品詳細ページからAMP対応するのがけっこう、現在のスタンダードだと思っていましたが、ebayはどうやら逆でした。

### なぜ、ebayは商品詳細ページをAMP対応していないのか？

これについては、完全に個人的な考えなので間違っているかもですが、これまでのAMPの仕様上、商品詳細ページで商品を購入できなかったことが大きな要因かと思われます。

つまり、

* 通常ページのユーザー導線：「iPhone 7」と検索 ->  商品詳細ページ -> 購入
* これまでのAMPページのユーザー導線：「iPhone 7」と検索 -> AMP商品詳細ページ -> 商品詳細ページ -> 購入

と、formが実装されていなかったことによる、ユーザビリティーの低下を考慮して、商品詳細ページにはAMPを対応していないのではと思います。

商品一覧ページでは、商品詳細ページに遷移するだけなので、特にformの必要もないですし。

もう一つ考えられることとして（コッチが主な理由かと）、AMPページはCDNにキャッシュされてしまうので、商品情報をすぐに変更することができません。
ネットオークションサイトとしては、それが商品詳細へのAMP導入の障害になったと思います。

ちなみに現在アンププロジェクトでは[amp-fresh](https://github.com/ampproject/amphtml/issues/4191)を実装予定中でして、今後、CDNにキャッシュされたAMPページにもデータがすぐに反映されるようになるみたいです。

## AMP実装方法
サブディレクトリ形式（トップドメイン直下に/amp/）

## CDN上のAMPページとパラメータ

https://www.google.co.jp/amp/m.ebay.com/sch/amp/Apple-Smartphones/9355/bn_319682/i.html
特にパラメータの設定はしていませんが、サブディレクトリ形式なので、必要ないですね。
（パラメータの設定とは、urlの末尾に?amp=1（例）とすることで、google analytics上などでAMPページのアクセス解析に役立ちます。）

## AMPページからの内部リンクパラメータ
アクセス解析用の内部リンクパラメータは設置されていませんでしたが、クリックイベントを非常に細かく設定されており、このあたりで調査できるようにしていると思われます。
例を下に残しておきます。

``` 
<a href="https://ebay.com/" data - vars - track = "[{"
ef ":"
LST ","
ea ":"
ACTN ","
pge ":2380231,"
plsUBT ":1,"
app ":"
Testapp ","
callingEF ":"
DFLT ","
difTS ":0,"
eventOrder ":0,"
moduledtl ":"
mi: 4324 | iid: 1 | li: 8280 | luid: 1 | scen: PRODUCTS_PROVIDER ","
parentrq ":"
01 c0a8be1590ab12abd0f11bfff93c3b ","
pageci ":"
3039 cdf6 - ed4e - 42 a6 - 9 ab8 - 37 bce1e97a29 ","
actionKind ":"
NAVSRC "}]">
```
ampという単語は入っていないので、ちょっと自信ないですが・・・

## 最後に

ebayは、AMPページの取り組みもさることながら、AMPページの次にユーザーが訪れるページの速度も非常に重要だと考えており、それに向けて実際にGoogleと協議しながら、いろいろと進めているみたいです。

また、ebayについて新しいことがわかったら共有します。
コマンドは付箋紙に貼り付けよう

下請けCOBOLERとして生きていた頃のノウハウ Advent Calendar 2016の9日目ぐらいの記事です。


##コマンドは付箋紙に貼り付けよう
だいたいCOBOL現場はインターネットは繋がらないし、evernoteの導入なんて不可能だと思います。


なのでwindows標準の付箋紙ソフトによく使うコマンドを貼り付けておきましょう。
特に汎用機へのログオンとそのパスワードは絶対書いておきましょう。
筆者はこれを忘れてアカウントがリセットされてしまい大変な目に遭いました。
また、うるさいところではパスワードは定期的に変えろとかあると思うので、パスワードは連番にしておいて
XXXX01→02のように増やしていくようにすると、変えた後も忘れにくいと思います。

また、ログオン以外にも汎用機やteratermでよく使うコマンドもあるといいでしょう。

unixコマンドはともかくホストのコマンドなんて手で打って覚えるようにしようってほど立派なものではありませんし、
手打ちしてミスってなんかトラブル起こすよりはよほどましです。

また、付箋紙は突如消えたりするのでテキストファイルにバックアップして共有サーバーの個人用ワークフォルダに入れておくこともお勧めします。


余談ですが、そういったコマンド集のようなテキストファイルをデスクトップに置いておくと、他のファイルと一緒にゴミ箱に捨ててしまうことがありますので、重要なファイルはショートカットをおくようにしておくと事故が防げて良いと思います。