OmniAICreator/Qiita-1.07M huggingface dataset:
何も知らない子がレスポンシブデザイン入門

# 前提
・普段そんなにフロントやってない
・レスポンシブデザインってなによ
・モバイルファーストなんでしょこれからは
・モバイルはもうスマホって言いかえるよ

# レスポンシブデザインって
・複数の端末の画面サイズに対応するWebサイトづくりのこと

・単一のファイルで制作し、端末や画像サイズで適時変化するようにする手法
※スマホ用とPC用でデザインを分けるのは違う

・複数ファイルによるURLの分散が防げるのはもちろん、更新なども容易になる

# レイアウトの種類
## リキッドレイアウト
ボックスの要素が端末に応じて伸縮して伝えられる。
要は常に、横幅いっぱいにブロックが表示される感じ。

## フレキシブルレイアウト
リキッドレイアウトと基本変わらない。
ただし、最小幅と最大幅の制限があり、
最大幅以上のときは余白が出来るような作り。

## グリッドレイアウト
メイン部はリキッドなどで。
一部のボックスを固定サイズとして、
画面幅に変更があった場合、それに応じて再配置されるレイアウト。

よく言われているのは、
画面を縦と横で方眼のブロックにして、
コンテンツを配置していく設計方法。

例)
http://www.nhk.or.jp/studiopark/
※ブラウザ幅を変えたりしてみてください

# HTML5とCSS3で実現しよう
## メディアクエリ
### メディアクエリ？
画面の表示幅とかで適用するスタイルを変える方法。
CSS3で実装する。

条件に応じて読み込むCSSファイルを変える方法と、
一つのCSSファイルで分岐を書く方法がある。

前者だと同じ属性やその値の管理がバラけそうなので、
ここでは後者について触れる。

### 基本的な記述方法
```lang:style.css
@media screen and 幅条件 {
  スタイル
}
```

幅条件を組み合わせて、上記のような記載を数種用意する。
すると、適時その幅などに合わせて、スタイルが変わる。

### 記載順のルール
ファイルの上から下へ。
つまり、
画面幅が小→大か、大→小のどちらかしかありえない。

|俗称|説明|
|:--|:--|
|モバイルファースト|小さいサイズから順に読んでいく方法|
|デスクトップファースト|大きいサイズから順に読んでいく方法|

主流はモバイルファースト。

### よく使う記述属性
max-widht：ビューエリアの最大幅。このサイズより小さい場合に適用
min-width：ビューエリアの最小幅。このサイズより大きい場合に適用

### 上記を踏まえてモバイルファーストな記述
```lang:style.css
//グローバル

@media screen and (max-width:480px) {
  //480pxまでのサイズ
}	
@media screen and (min-width:481px) and (max-width:768px) {
  //481px~768pxまでのサイズ
}
@media screen and (min-width:769px) and (max-width:1200px) {
  //769px~1200pxまでのサイズ
}
```

## viewport
### 言葉としてのviewport
ブラウザの表示領域のこと。

PCの場合、viewportに収まらない場所は
スクロールすれば良い。

じゃあスマホは？

### スマホのviewport
何もしないと、
スマホはPC向けサイトを表示するときに、
**デフォルトで横幅980pxデザイン**
という前提で描画する。

**→結果：文字が小さい！**

そこで・・・。

### HTMLのviewport
端的に言ってしまえば、
スマホの表示をフィットさせるための機能といっていいだろう。

コレすなわち
**スマホ向けにデザインしているよ！**
という主張になる。

ちゅーても、サイトの作りによって表示のさせ方は違うので、
細かい設定は必要になる。

### 基本的な記述方法
```index.html
<meta name="viewport" content="表示条件">
```

表示条件はカンマ区切りで複数かける。

### content属性にかけるもの
|属性|説明|
|:--|:--|
|width|表示領域の幅<br><br>数値：ピクセル数<br>device-width：画面幅に合わせる|
|height|表示領域の高さ<br><br>数値：ピクセル数<br>device-height：画面高に合わせる|
|initial-scale|初期のズーム倍率|
|minimum-scale|最小倍率(0~10、デフォ0.25)|
|maximum-scale|最大倍率(0~10、デフォ1.6)|
|user-scalable|ズーム操作の許可(yes | no)|

### とりあえず
コレ安定？(要検証)

```index.html
<meta name="viewport" content="width:device-width, maximum-scale=1.0, minimum-scale=0.5,user-scalable=yes,initial-scale=1.0">
```

## Retina
### Retinaってなんなのよまじで
きれいなのすっごく。

なぜきれいなのか？
↓
画像って結局、点(ピクセル)の集合体。
点が細ければ細かいほど、鮮明に表現できます。

その昔は、
ピクセルっていったら、全部同じサイズで、
ピクセルから画面サイズも割り出せた。

でもレッティーナさんのお陰で、それができなくなってしまった。

### Retinaのせいでメディアクエリのピクセル数と一致しなくなるんじゃ！？
実はここでviewportさんが活躍します。

width=device-width
height=device-height

の値は
デバイスの解像度 ÷ デバイスピクセル比
となる。

一度用語をまとめよう。

|用語|説明|
|:--|:--|
|CSSピクセル|CSSで使われる仮想的なピクセル。<br>これが全ての基準。<br>メディアクエリで指定しているのもこれ。|
|デバイスピクセル|そのデバイスのピクセルの細かさ。|
|デバイスピクセル比|CSSピクセルの幅にデバイスピクセル何個はいるの？っていう比率。|
|デバイスの解像度|デバイスの画面サイズの中に入っている、<br>デバイスピクセルの数。<br><br>縦×横で表記されたりする。|

話を戻しましょう。

上記の用語を踏まえると、実画面サイズって、
デバイスの解像度をデバイスピクセル比で割ってあげれば、
実画面サイズがでるってことですよね？

！！！！？？？？

そうです。

width=device-width
height=device-height

の値は
デバイスの解像度 ÷ デバイスピクセル比
となる。
という話に戻ってきます。

つまりviewportで上記を指定していれば、
画面サイズに関しては解決！となるわけです。

### Retinaで考える事
画像です。
鮮明な画像を使いたいときにだけ考えれば良いのです。
iptablesをnftablesに変換してみた

iptablesで作ったパケットフィルタリングルールをnftablesに変換してみた。
以下はよくある入力は特定ポートしか受け付けなくするiptablesのスクリプト

```bash
#!/bin/sh
iptables -F
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT

iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT

iptables -A INPUT -p tcp -m tcp --dport ssh -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport smtp -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport domain -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport http -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport https -j ACCEPT
iptables -A INPUT -p udp -m udp --dport domain -j ACCEPT

iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
```

これをnftablesでやると以下にようになる。

```bash
#!/usr/sbin/nft -f
flush table filter

table filter {
        chain input {
                type filter hook input priority 0; policy accept;
                ct state established accept
                ct state related accept
                iif lo accept
                tcp dport {ssh,smtp,domain,http,https} accept
                udp dport domain accept
                ip protocol icmp accept
                counter drop
        }

        chain output {
                type filter hook output priority 0; policy accept;
        }
}
```
【PHP】CSVのダウンロードって

こんにちは:whale2:
CSV ダウンロードページって昔は文字化けに苦しめられていたイメージがありますが、最近はどうなのでしょう。

### ソースコード

以下のような感じで、Windows / Mac で化けませんでした。

```php:CSVダウンロードページ
<?php
error_reporting( -1 ) ;
ini_set( 'display_errors', 1 ) ;

$csv_text = '㍊,㍻,髙,靍,濵,﨑,①,Ⅳ' ;
$csv_file_name = 'やゔぁい文字が含まれた.csv' ;


header('Content-Type: text/csv') ;
header('Content-Disposition: attachment; filename=' . $csv_file_name . "; filename*=UTF-8''" . urlencode($csv_file_name)) ;
echo pack('C*',0xEF,0xBB,0xBF) . $csv_text ;
```

### おわり

Content-Type に `application/vnd.ms-excel` とか `application/octet-stream` とか指定したり、
[mb_convert_encoding()](http://php.net/manual/ja/function.mb-convert-encoding.php) で [SJIS-win](http://php.net/manual/ja/mbstring.supported-encodings.php)に変換したり、
Mac版ExcelのためにBOM付きUTF-16LEに変換したり、
ファイル名はアルファベットだけに制限したり、
…する時代は終わったのだろうか[^maybe]。

すてき:cherry_blossom: [^welcome]

### 参考と注釈

* [【PHP】mb_convert_encodingでUTF-8→SJIS文字化け](http://blog.so-lat.com/dev/2011/01/%E3%80%90php%E3%80%91mb_convert_encoding%E3%81%A7utf-8%E2%86%92sjis%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91/)
* [【php】はしご高が文字化けしない文字コード変換](https://www.softel.co.jp/blogs/tech/archives/5145)
* [PHPでダウンロードさせるファイル名がIEで文字化けする件 - Qiita](http://qiita.com/takehironet/items/79c025e4140e29c57abe)
* [ExcelでBOM付きが無双するPHPでのCSVの書き出し方](http://alaki.co.jp/blog/?p=1260)
* [エクセルで文字化けさせないCSVの作り方](http://dev.blog.fairway.ne.jp/php%E3%82%A8%E3%82%AF%E3%82%BB%E3%83%AB%E3%81%A7%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91%E3%81%95%E3%81%9B%E3%81%AA%E3%81%84csv%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9/)
* [PHPでExcelで開いても文字化けしないCSVを出力する - Qiita](http://qiita.com/ikemonn/items/f2bc4f9f834c989084ff)
* [List of HTTP header fields - Wikipedia](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields)

[^maybe]: しかし[Apache OpenOffice](http://www.openoffice.org/ja/)では開けないという噂をきいたことがある。ほんと？
[^welcome]: 詳しい人達に後ろから刺されたい。:bow_and_arrow:
ImageMagick7で画像を比較して数値化

# 画像を比較して数値化
・ImageMagick6系ではなくImageMagick7系
・環境 Windows10
・模索中

## composeとcompositeコマンドの組み合わせ
黒い画像を作ります。
比較して違う部分があれば明るいほうが残るぽい。
```magick "*.png(比較対象1)" "*.png(比較対象1)" -compose difference -composite "*.png(出力画像)"```


## identifyで数値化
```magick "*.png(出力画像)" -format "%[mean]" info:
```
objectに対するmockもやっぱりpatch経由のほうが見やすい気がした

objectのメソッドに対するmockの話。

```python
class Foo(object):
    def hello(self, v):
        raise Exception("foo")
```

に対して、objectに対してmockをかける時には以下のように書ける

```python
foo = Foo()
foo.hello = mock.Mock()
foo.hello.return_value = "yup"

assert foo.hello("bar") == "yup"
foo.hello.assert_called_once_with("bar")
```

ただ、patch経由でかけたほうが見やすい気がする。

```python
foo = Foo()
with mock.patch.object(foo, "hello") as hello:
    hello.return_value = "yup"

    assert foo.hello("bar") == "yup"
    hello.assert_called_once_with("bar")
```
一日目

というわけで一日目
・・・何しよう

悩みながらネットで情報集め10分

結局とりあえずページを最低限表示しようってことにした

前のやつとか合わせて・・・・

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset = utf-8"/>
  <title>button_test</title>
  <meta charset="utf-8" />
</head>
<body>
<div id="output"></div>
</body>
</html>

お、ボタンテストってページ名だけ出た

んじゃあとはJSとの関連付け（？）とか数字の表示とかボタンの作成だな（ほぼ終わってない）

明日になるかはわかんないけど二日目は関連付け（？）をやりたい
XamarinからLuisを使ってみる（その２）

このエントリは [Xamarin(その2) Advent Calendar 2016](http://qiita.com/advent-calendar/2016/xamarin2) の13日目の投稿です。

# 引き続きLUIS

## MicrosoftのBot用言語解析フレームワーク

LUISが何をするものかというと、ざっくり言って「自然言語 → コンピュータ用コマンド」のトランスレーターです。
人が話したり文字にしたものを定義されている文例から探し出し、スコアを付けてどのコマンドと思われるかを出力します。

というのが [Xamarin Advent Calendar 2016 の13日目](http://qiita.com/yakumomo/items/081c011629cb822ff874) にも書いたことでした。

## 今回作ったソース

そもそもコントロールする実機を用意しているわけでもなく、LUISを使ってみたい！というところからプロジェクトに繋げているので未完成度満々ですが。

[GitHub](https://github.com/yakumo/YaHC/tree/master) にソースを置きました。
（一応、uwpとiOSではLUISを呼び出して動くところまでは確認しています）

|プロジェクト拡張子|概要|
|:---|:---|
|.common|共通部分(Xamarin.Forms, PCL)|
|.uwp|uwp用起動部分|
|.ios|iOS用起動部分|

基本的には.commonの中にすべて入っています。
残りはホントに起動させるだけですね。

## LUIS呼び出し部分

[Xamarin Advent Calendar 2016 の13日目](http://qiita.com/yakumomo/items/081c011629cb822ff874) に書いたことですが、実際には [luisExecuter.cs](https://github.com/yakumo/YaHC/blob/master/YaHC.common/Luis/luisExecuter.cs) に組み込んであります。

```csharp
            var client = new HttpClient();
            var json = await client.GetStringAsync(String.Format("https://api.projectoxford.ai/luis/v2.0/apps/****?subscription-key=***&verbose=true&q={0}", Uri.EscapeDataString(query)));
```

33行目ですね。
ちなみに該当のLUISのアプリは削除してありますので、今このソースではどこにもつながりません。
申し訳ない。

その後Deserializeを行い、

```csharp
                var result = JsonConvert.DeserializeObject<LuisResult>(json);
```

実行メソッドを呼び出します。

```csharp
                        DelegateMethods[intent].Invoke(this, new object[] { result });
```

インテントと実際のメソッドとの関連付けはどうなっているかというと、LuisIntentというAttributeを使って関連付けています。

```csharp
        [LuisIntent("heatBathWater")]
        private void HeatBathWater(LuisResult result)
        {
            Debug.WriteLine("HeatBathWater,result:" + result);
            HomeItemCollection.Instance.Find("bath")?.Switch(SwitchType.On);
        }
```

Attributeの定義は[luisExecuter.cs](https://github.com/yakumo/YaHC/blob/master/YaHC.common/Luis/luisExecuter.cs) の100行目～

```csharp
    [AttributeUsage(AttributeTargets.Method)]
    public class LuisIntentAttribute : Attribute
    {
        public string IntentName { get; private set; }

        public LuisIntentAttribute(string intent)
        {
            IntentName = intent;
        }
    }
```

関連付けの実行は19行目のコンストラクタ内で。

```csharp
        private LuisExecuter()
        {
            foreach (var m in this.GetType().GetRuntimeMethods())
            {
                var attr = m.GetCustomAttribute<LuisIntentAttribute>();
                if (attr != null)
                {
                    DelegateMethods[attr.IntentName] = m;
                }
            }
        }
```

このAttributeを使ってIntentとメソッドを関連付けるやり方は、Bot Frameworkでもやっていて、それと同じことを行っています。
こうしておくことでAttribute付きのメソッドを並べていくことで対応関数を増やすことができます。

ただまあ、手軽にやるならIntentと同じ名前のメソッドを用意してRefrectionで見つけて実行させる、という方法でも問題ないと思いますが。

## 終わり

コンセプトのわりにやっていることはC#初心者用、という感じで。
申し訳ない。

毎年初心者用ものを書いている気がします。
GETPIVOTDATAはどっちの構文を使うべきか？

LibreOffice 2016 AdventCalendar 12月14日の記事として投稿します。


ピボットテーブルからデータを取得する関数にGETPIVOTDATA関数がある。
LibreOffice CalcにもMicrosoft Excelにも全く同じ関数がある。

LibreOffice CalcでGETPIVOTDATA関数のHelpを見ると下記の2つの構文がある。
どっちを使うべきなのだろうか？

- GETPIVOTDATA(対象フィールド; ピボットテーブル; [ フィールド 1; 項目 1; ... ])
- GETPIVOTDATA(ピボットテーブル; 制約)

結論から言うと1つ目の構文を使うべきです。

##過去バージョンとの互換性の為に残しているだけ

###Excelの場合
Excel2000までGETPIVOTDATAの構文は GETPIVOTDATA(ピボットテーブル,制約) のみでした。
Excel2002以降になるとGETPIVOTDATA(対象フィールド; ピボットテーブル; [ フィールド 1; 項目 1; ... ])を使うようになりました。

現在のMicrosoft Excelのヘルプでも上の構文しか説明されてません。
Microsoft Excelでは過去のバージョンのファイルとの互換性の為だけに残しているだけだと思われます。

###LibreOffice Calcの場合
LibreOfficeでもHelpには2つ併記されておりますが、
LibreOffice Calcの関数ウィザードではGETPIVOTDATA(対象フィールド; ピボットテーブル; [ フィールド 1; 項目 1; ... ])の構文を使うように誘導します。
LibreOfficeでもGETPIVOTDATA(ピボットテーブル; 制約)の構文はExcelの過去バージョンとの互換性の為に残しているのだと思われます。

##結論

GETPIVOTDATAはGETPIVOTDATA(対象フィールド; ピボットテーブル; [ フィールド 1; 項目 1; ... ])だけを覚えるようにしましょう。

##参考文献
[Excel豆知識45:エクセル:ピボットテーブル（GETPIVOTDATA関数)](http://www11.plala.or.jp/koma_Excel/contents6/mame6045/mame604501.html)
Excel2000までの時とExcel2002以降の書式(構文)が違うと言っている。

[GETPIVOTDATA 関数 - Office のサポート](https://support.office.com/ja-jp/article/GETPIVOTDATA-%E9%96%A2%E6%95%B0-8c083b99-a922-4ca0-af5e-3af55960761f)
Microsoftの現在のヘルプでは新しい構文しか説明していない。

[表計算ドキュメントの関数 - LibreOffice Help](https://help.libreoffice.org/Calc/Spreadsheet_Functions/ja#1_.E7.95.AA.E7.9B.AE.E3.81.AE.E6.A7.8B.E6.96.87)
両方の構文が併記されている。
Jupyter notebookのパスワード

# Jupyter notebook最新版のセキュリティ
notebookパッケージが4.3になってから、セキュリティが強化されたようです。
参考: [Security in the Jupyter notebook server](https://jupyter-notebook.readthedocs.io/en/latest/security.html#server-security)

「jupyter notebook」とすると、パスワード入力を求められます。
![image](https://qiita-image-store.s3.amazonaws.com/0/13955/141fcd8b-c605-24b4-3e05-04a883876951.png)

下記の手順で使えるようになります。

## (1) 下記のように設定ファイルを作成する。

```
jupyter notebook --generate-config
```

## (2) 設定ファイルを編集する。
編集方法は、2種類あります。

 |方法|設定内容|説明
:--|:--|:--
A|tokenを設定|平文で文字を指定
B|passwordを設定|暗号化して設定

### (2-A) tokenを指定する場合
下記を~/.jupyter/jupyter_notebook_config.py に追加してください。(xxxは適宜変えてください)

> c.NotebookApp.token = 'xxx'

この場合、login画面のパスワードとして「xxx」を入力するか、ブラウザのURLで下記のようにするかのどちらかで利用できるようです。

> http:ホストのURL:8888/?token=xxx

### (2-B) passwordを指定する場合
まず、pythonで、下記を実行し、パスワード(例えば xxx)を2回入力し、ハッシュ文字を取得してください。

```
python -c 'from notebook.auth import passwd;print(passwd())'
>>>
sha1:152704c5513c:0e0781437e7d013892eb7662f5ee5a67b235ec1a
```

~/.jupyter/jupyter_notebook_config.py に下記のように追加してください。

> c.NotebookApp.password = 'sha1:152704c5513c:0e0781437e7d013892eb7662f5ee5a67b235ec1a'

この場合、login画面で指定したパスワードで入力できます。URLのオプションは使えないようです。

## 2022/08/02追記

JupyterLabの場合の説明ページ：https://jupyter-server.readthedocs.io/en/latest/operators/public-server.html

以上
アンテナの張らせ方と技術寄りな人材の見分け方（自分のキャリアも振り返ってみる）

# このページについて
最近、かなり思うことがあったので、キャリアを振り返りつつ、
技術側ではなかったエンジニアが、今では技術マニアだと周りから思われている現状において、
何でこうなったんだっけ？と自分のキャリアも振り返りつつ、考えてみるページです。
※今の周りの感度が低いだけで、技術マニアなんてことは実際ないです。

「技術寄りな人材の見分け方」は後付けしました。
書いていったら、技術的な人材になりそうな社員か、どうか選別できてるんじゃない？となったので。

# 自己紹介
大手SIer（実質２社目）でプログラマ兼DBA（兼アーキ休業中）をやっている、
30ちょっと過ぎエンジニアです。

# 以前はどうだったか
今の会社には、吸収合併されて入りました。
合併前の会社では、
客先常駐で、プログラムはバリバリ書いてました。
それと同時に保守業務を行ってくれている、派遣で雇っていた社員さん数名を、
仕事が集中しすぎないように、客先調整したり、
進捗がまずい時は、手伝ったりといったことをしていました。
立場としては、プレイングマネージャに近かったです。

なので当時は漠然と、日本でよくあるキャリアの積み上げ方（プロジェクトマネージャ）をするのであろう、
と思ってました。

## この時のアンテナ
日頃の業務で必要なスキルで足らない部分については、
本を買って、手を動かしてみて足手まといにはならないようにしてました。
が、自分の業務に関係ないものについては、調べたり、はしてませんでした。
なので、アンテナの感度は低かったです。

この時は、IT系のサイトなんて見てなかったです。

# 転機
合併ですw
合併前にいたグループごと、合併先の会社に元からある部署に所属となりました。
この時、売り上げで競争にならない、という理由で、長年働いた常駐先は引き上げとなり、
会社に戻ることになりました。（５年前くらい）

この時から自社で開発をするようになりましたが、
もともと自社で開発するようなグループではなかったので、
社内で開発する仕組みから作る必要がありました。

また、見積り書や提案書も書くようになり、どんな技術を使うのか、など、
今まで求められてなかったスキルを求められるようになりました。

開発に必要なものを、ツールを使ったりして、１つずつ着実に解決していきました。

## この時のアンテナ
業務範囲外のモノにも目を向けるようになりました。
ただし、日常的には情報を集めてなかったです。
情報源は主に日経SYSTEMS（月刊誌）でしたし、そこから興味あるものを深掘りした感じです。

なのでアンテナの感度は、中の下くらいかなと思います。

この時、初めてRedmineやJenkinsと云ったOSSの便利ツールを知って、
プロジェクトで積極的に採用、自グループに啓蒙していきました。
開発プロセスを好きに作って、改良して良いっていうのは、
今もそうですが、すごく面白いです。
プログラミング言語スキル以外の技術的な価値もあるんだなってことに、この時、気が付きました。

# 決定打
会社で開発するようになって暫くしたある時、私が所属するグループの長（本当にスーパーエンジニア）が言いました。
「お前らは、技術の感度が低いから、これから朝会で、気になった技術ニュースを、なぜそれが気になったのかも含めて、持ち回りで発表しろ」と。

この時は、まだまだ常駐組も多くて、社内にいた人間は10人いないくらいだったと思います。
なので、割とすぐに自分の番が回ってきます。
こんなことで、評価を落とされたら溜まったものじゃないので、
自分の番の、前日の帰りの電車と、当日の行きの電車では一生懸命調べてましたw

暫く行っていると、やっぱり調べて来ないメンバーが出てきたりしたので、
こんなことで、朝から皆で怒られるのも、めんどくさいなっていう理由で、
調べて来ない人がいた場合は、代打を買って出るようになってました。

## 補足
この朝会を始めた時、正直、俺たちはバカだ！と社内中に言っているような朝会じゃん。。
って思っていたので、始めた当時はかなり嫌でした。

ただグループの長が、
「この朝会の内容は、実際の提案で使えるものも在ったり、
ちょっと客先に行って客と話した時に、前に朝会で出た内容だったから、会話が盛り上がった、ありがとう」
など言われた時に、
「僕から見たら化け物エンジニアにも役に立つ会だったんだ」っていうので、
朝会自体は嫌ではなくなりました。

## この時のアンテナ
日常的に情報収集しているので、感度は高いと行って良いかなと思います。

この時は完全に、技術に対して自走している状態になってました。
とはいえ、すべてを一変には変えられないので、
良いと思うことを１つないし２つくらい取り入れて、生産性を上げていけてた時期です。
上げた生産性で出た余裕の納まる範囲で、また新しいものを取り入れてみるという好循環期も経験したので、この時期は自分のキャリアの中でも、一二を争うレベルで面白かった時期です。

そうして、何か知らないうちに、社内で知っている人は知っている存在になってました。
※決して知名度が高いわけではない。

# なんで技術側を選んだのか
スキルを持っている人間を大事にしよう！
と、頑張っている層が、いることを知ったのがきっかけです。
この会社って、そっちの道もあるんだ、と。

これを知った時と同時期に、持っている知識を持っていない人たちに、
アウトプットすることの大切さみたいなのも教えてもらいました。

# 今、行っている活動
週１で、技術を肴にランチミーティング(1hみっちり)をしています。
OJTの一環なので、1on1です。

はじめは、難易度高いかな？そもそも、技術興味あるんだっけ？これで良いのか？とも思いましたが、
本人的にも楽しんでくれているみたいなので、良かったです。
1on1ってのも良かったのかもしれません。
内容は、以前の朝会の内容とほぼ同じですが、実際のコードや、プロトタイプして動くモノも出てきて、
結構充実している会なのではないかと思います。
（が、同じ部署の人に声をかけても誰も来ないので、そうでもないのかも。）

将来的には、プレイングマネージャになってもらえたら良いなと。
（僕も以前みたいに、そんな感じで働きたいです）

# 僕が考えるアンテナの張らせ方と、技術寄りな人材の見分け方
* 技術的なアンテナは、調べた結果を発表させる機会を作ってあげれば、アンテナを張るようになります。<BR>組織としてトップダウンでやっても良いし、OJTというのを利用しても良いと思います。<BR>※とにかく上からやらせる環境を用意する
* 毎日１h実施などとはせずに、情報を調べる側の負担が少なくなるように期間を空ける。<BR>持ち回り発表の場合は、時間を短くして毎日開催にシフトして、参加者の自由時間が失くならないようにしてあげると良いと思います。
* 技術方面に来そうかどうかは、持ち回り発表をさせて、調べて来なかった人間の代打を買って出る人は、技術方面な人材になり得る。<BR>ただし、初めから技術方面の人材が混じっていると、表に出て来ない可能性があるため、主催者側から話を振ってみても良い。（調べてこなかった人間がいた場合は、キラーパスが飛ぶというのを認識した上で、どういった行動に出るのか見てみる）
* 1on1の場合は、多分勝手に技術方面になる（はず）<BR>※施行中なので「はず」です
アイヌ語（小文字カタカナ、半角カタカナ）を日本語（全角カタカナ）に変換するスクリプトを書いた

## アイヌ語
- アイヌ語については本記事の趣旨と異なるので下記を参照してください
- https://ja.wikipedia.org/wiki/アイヌ語 


## 概要
- 以下の記事にあるようにアイヌ語にはカタカナの小文字が存在します(例: 「ㇰ,ㇱ,ㇲ,ㇳ,ㇴ」)
- Unicodeとして存在していますが、ㇰはU+31F0、ㇱはU+31F1であることからアスキーコードの全角のクとㇰの差を応用することは厳しいです
- また、Macのことえりでは標準で入力出来るらしいですが、Windowsなどでは標準で小文字カタカナを入力出来ないのでｸなど半角カタカナで代用する場合もあります。
- そこで、一部の半角カタカナも全角カタカナにするスクリプトにしました
- https://ja.wiktionary.org/wiki/Wiktionary:アイヌ語のカナ表記

## 解決法
- http://pumpkin.hatenablog.jp/entry/20090416/1239892152 のサイトを参考に人間味のあるコードを書きました
- 2016年12月15日 scivolaさんのコメントを基に修正致しました　ありがとうございます
 - trを用いるとセ゚など半濁点がつくものは2文字扱いになってずれてしまうようです
  - ピなどは別ですが...

```ruby
def ainu_to_japanese(text)
    text.gsub(/ﾌﾟ|ㇷ゚/,"プ").gsub(/セ゚/, "セ").gsub(/ツ゚/, "ツ").gsub(/ト゚/, "ト").tr"ㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿｸｼｽﾄﾇﾊﾋﾌﾍﾎﾑﾗﾘﾙﾚﾛ",
                              "クシストヌハヒフヘホムラリルレロクシストヌハヒフヘホムラリルレロ"
end
```

## 実行例
```ruby
p ainu_to_japanese("アｼケペッ")  # => "アシケペッ"
p ainu_to_japanese("チュㇷ゚ケㇱ") # => "チュプケシ"
```

## 問題
- ㇴはヌとンの2つの読み方があるのですが、このコードでは使い分け出来ません
中学高校数学をやり直して大学行き２年で辞めたこと

以前、ブログでこんな記事をだらだらと書きました。良い機会なので、まとめ直してみます。

数学のおさらいについて
[http://kanariya0922.hatenablog.com/entry/2014/03/20/120952]

以前、数学ガールを書店で手に取ってパラパラめくっていたときに登場した数式を見て、昔勉強したことなのにすっかり忘れて頭が混乱したことがきっかけで、長い間細々とやり直しを試みていたのですがなかなか持続できませんでした。
「やり直しのゴールをどのラインに定めるか」
を考え直したことで、再スタートすることができました。

高得点をめざしていた学生のころの気持ちやプライドは捨て、中学高校の基礎をざっくり流し問題や数式を見てどんな意味があるのかだいたいイメージできたらもうけもん！ぐらいにしました。

# 中学数学
1年〜3年の10分ドリルをこなしました。

# 高校数学
中学数学終了後にすんなり高校数学へ移行できませんでした。格段にレベルが上がることを改めて痛感し自信をなくしたのですが、せめてNHK高校講座で数1だけでもやり抜くことにしました。これでやる気が戻ってきたので数2も終らせました。さすがNHKだけあってすばらしい教材です。
[http://www.nhk.or.jp/kokokoza/library/]
数学とふれあう時間が増えたおかげで数学ガールをなんとか読めるようになりました。

# WEB+DB PRESS vol.72との出会い
「あのひとのはたらきかた」で帝京大学理工学部通信課程を知り、これまで引け目に感じていた文系出身から脱却したい一心で編入を決意。レベルが追いつけないのではないかという不安で、開始までに高校数学の問題集をこなしました。
薄くて量がほどほどで図式がわかりやすい問題集を選びました。とにかく目が逃げないように、自分を励ましながら。数1,数A,数2,数B,数3&Cをやり通しました。

# 大学数学：線形代数
通信制の授業はほとんどが自習してレポートを提出するものでしたが、書籍上の説明ではどうしてもイメージがつかず、なかなか先に進みません。
そこでお世話になったのが放送大学の線形代数の授業でした。このころの線形代数はインターネットで無料で見ることができて、本当に助かりました。

# 大学数学:微分積分1
レポートの添削では先生からの愛の鞭をくらい、一回でパスすることができず心が折れたりもしましたが、なんとか合格することができました。このときが一番勉強していたと思います。

# そして辞めました
このころは在宅で仕事をしていたため時間の融通がきいていたのですが、事情が変わって引っ越して出勤することになったり、プライベートでもいろいろありまして後方支援にシフトチェンジせざるを得なくなりました。いずれしかるべきときが来たらもう一度復帰したいです。

# やり直したことで何かいいことはあった？
たくさんあります！
目標だった「問題や数式を見てどんな意味があるのかだいたいイメージできる」ようになりました。
理系の人々の会話に聞いたことがある語句が登場するたび、やり直してよかったなぁとニマニマしてしまいます。それだけ？と言われてしまうとそれまでなのですが、でも相手の人が一生懸命アウトプットしてくれていることに耳を傾けることができるのはとてもうれしいのです。あとは月並みではありますが、自分なりのゴールを決めてある程度が継続できたこの経験が日々の自分をしっかりと支えております。

数学をやり直したくても
やることが膨大だったり
世の中にはきらめく才能や能力を持つかたたちがたくさんいたりして
気落ちして呆然としているかたがもしいらっしゃったら
ゆるいゴールでだらだら歩いていた奴がいるということで、少しでもお役に立てれば本当にうれしいです。

そういえば技術のことを何も書いてないので、ごめんなさい。
GitHub 初歩的な不具合解消法

GitHub触りたてのときは不具合が出ると青ざめますが
回復方法を知っていれば落ち着いて対応できます。
SourceTreeを使った簡単な不具合解消法をいくつか紹介。



<!--
##メニュー
- [競合ファイルの解消](#競合ファイルの解消)
- [作業をリセットする](#作業をリセットする)
- [誤ってプルリクをCloseした場合](#誤ってプルリクをCloseした場合)
-->

<!------------->
##<i class="fa fa-share-alt-square"></i> 競合ファイルの解消
masterとブランチの差分に誤差があるとき、ファイルに競合が起こります。
このままだとコミット（プッシュ）できないので、解消します。

1. SourceTreeの画面上で【！】マークが付いているのが、競合してしまったファイルです。

>
![00.png](https://qiita-image-store.s3.amazonaws.com/0/54596/2ac8e1bb-ddd2-37a0-0e5d-431836121c84.png)


1. 【！】マークが付いたファイルをDreamweaverで開くと、masterとブランチの差分が表示されました。
誤った方を削除、もしくは正しい記述に書き換えて保存します。

※"＜＜＜＜HEAD"などの記述も残さず消すこと！


>
![01.png](https://qiita-image-store.s3.amazonaws.com/0/54596/3d94fd5d-cc12-d4b0-5ec8-2b14e82da9c2.png)


1. ファイル修正が終了したらファイル名を右クリック、競合を解決＞【解決済みにする】を選択。

>
![02.png](https://qiita-image-store.s3.amazonaws.com/0/54596/60d97914-fffa-e929-95e4-15ecf7e4be6f.png)

1. ![comit.png](https://qiita-image-store.s3.amazonaws.com/0/54596/e3b85b9b-e0b2-3e87-35a8-c9a9dc8af872.png)をクリックすると、自動でコミットログに競合の証跡が記入されている。
「※競合解決済み」などコメントを残してコミット＆プッシュする。





<!------------->
##<i class="fa fa-share-alt-square"></i> 作業をリセットする
作業のミスに気づいて、ちまちま修正するよりもゼロに戻してやり直した方が早いときはリセットしてしまいましょう。

1. SourceTreeでリセットしたいファイル名を右クリック、【リセット】を選択。
>
![r01.png](https://qiita-image-store.s3.amazonaws.com/0/54596/05e4d473-2efe-51b2-db35-31eb37fc8e01.png)


1. 確認ポップアップに【OK】。
>
![r02.png](https://qiita-image-store.s3.amazonaws.com/0/54596/3c78b8e1-dd43-2784-00bf-d9dc38ee82d2.png)





<!------------->
##<i class="fa fa-share-alt-square"></i> 誤ってプルリクをCloseした場合


誤ってGitHubのプルリクエスト画面の【Close pull request】を押してしてしまいました…
まだ作業が残っており、復活させたいです。

![c01.png](https://qiita-image-store.s3.amazonaws.com/0/54596/8b519137-e346-10de-9af4-dd22c3219071.png)
↓「Closed widh unmerged commits」と表示されています…

![c02.png](https://qiita-image-store.s3.amazonaws.com/0/54596/c256f70c-285c-5cec-01af-87e15a32a7f3.png)


###復活方法

-  「Closed widh unmerged commits」と表示されている枠の直下に 【Reopen pull request】のボタンがあるのでクリック。 
    -  ![c03.png](https://qiita-image-store.s3.amazonaws.com/0/54596/d44dd39d-0397-224f-57ac-e2c53dc33940.png)
-  タイムラインに「reopened this」と表示され、プルリクが復活しました！<br>
【Close pull request】ボタンも復活します。
    -  ![c04.png](https://qiita-image-store.s3.amazonaws.com/0/54596/30141998-2e39-6b1b-ea25-3a7f24822ce4.png)




おしまい。
BootcampでWindows動かすときにやること

随時追記します。

# MacBookPro 2017にインストール

2014MidでBootcampしてたときに
Windows8 dsp版を使ってたんですが
2017に買い換えてBootcampしようとする
Windows10じゃないから無理、みたいなエラーメッセージが出て困ったぞ。と。

Windows10のisoイメージダウンロードページを
MacOSで開くと、isoイメージそのものがダウンロードできます。
https://www.microsoft.com/ja-jp/software-download/windows10ISO

このisoイメージで新規インストールする途中で
Windows8のプロダクトキーを入れるだけで問題なく完了しました。

Windows8のISOイメージからどうにかインストールしようと無駄に格闘してしまったｗ


# 左CommandキーをCtrlキーにする
初期状態はWinキーですが、これをMacと合わせてCtrlキーにします。
レジストリをいぢります。
↓をコピペして適当なファイル名で拡張子.regで保存して実行。

```
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,1d,00,5b,e0,00,00,00,00
```

実行後に再起動して適用されます。


# F1,F2などのファンクションキーをFn修飾なしに
ファンクションキー単体押しで機能するように変更します。
「Boot Camp コントロールパネル」から行います。

Windows10とかだと場所がわかりにくいですが
スタートボタン　→　Windowsシステムツール　→　コントロールパネル
懐かしいアイコンが並ぶコントロールパネルが開くので
その中の「システムとセキュリティ」に居ます。

「キーボード」タブの
「F1、F2などのすべてのキーを標準のファンクションキーとして使用」
にチェックを入れて、適用を忘れずに。すぐ反映されます。



# 日本語入力できない

http://kuneoresearch.com/bootcamp-keyboard-driver-re-install/
こちらの記事が大変参考になりました。
gitのbranchをわける


##ブランチの作成（ローカル）

```
git branch [名前]
```

##ローカルのブランチを確認

```
git branch -v
```

##ブランチを切り替え

```
git checkout [名前]
```

##リモートのブランチにpush

```
git push origin [名前]
```

リモートのブランチはコマンドで作成しなくとも、上記のようにpush先にブランチ名を指定すると新しく作られるらしい。

##リモートのブランチを確認

```
git branch -r
```
##ブランチを削除

```
git branch -d [名前]
```

消したいブランチ上にいると上記コマンドは効かないので注意。

##masterブランチからpullする

masterブランチの変更箇所を今のブランチにpullするときは

```
git pull origin master
```

##hanakoブランチ（masterブランチ）にtaro（自分のブランチ）をpush

```
git push origin master:taro
```

##参考
http://qiita.com/mather314/items/a1536c52a2eb0426b2b5
http://blog.asial.co.jp/925
CheckiO がいつの間にかJavaScriptに対応していました。

# コーディングの勉強をゲーム感覚で進められる[checkio](https://checkio.org/)がJavaScriptに対応していました。
業務ではあまり使うことがないPythonではあまり遊ぶ気にならなかったのですが、JavaScriptにも対応してくれたということで嬉しく思います。
新卒教育などにも使えるかな？

→日本語にも対応していました。

### checkio
https://checkio.org/
AWS CLIによる SSL証明書の操作

### 前提
aws-cliはインストール(conf設定)済みであること。

#### 証明書のアップロード
```
aws iam upload-server-certificate --server-certificate-name {証明書キー} --certificate-body file://ca.crt --private-key file://ca.key
```

#### 登録済み証明書一覧取得
```
aws iam list-server-certificates
```

#### 登録済み証明証詳細取得
```
aws iam get-server-certificate --server-certificate-name {証明証キー}
```

#### 登録済み証明書削除
```
aws iam delete-server-certificate --server-certificate-name {削除対象証明書キー}
```

#### ELB情報取得
```
aws elb describe-load-balancers --load-balancer-names {ELB名}
```

#### ELBのHTTPSリスナーにSSL証明書登録
```
aws elb create-load-balancer-listeners --load-balancer-name {ELB名} --listeners Protocol=HTTPS,LoadBalancerPort=443,InstanceProtocol=HTTPS,InstancePort=443,SSLCertificateId=arn:aws:iam::{ARN}:server-certificate/{証明書キー} --region {対象リージョン}
```

### 最後に
ELBを利用しているなら、東京リージョンでもSSL証明書は無料で発行可能です。
但し、ドメイン認証のみとなり、企業認証をしたい場合は個別に発行する必要があります。
ProjectNami で Unicode 文字列を扱う

Azure SQL Database/SQL Server で WordPress を動作させるソリューションに [ProjectNami](http://projectnami.org) があります。

標準の状態で日本語を扱うには、サーバーの照合順序を `Japanese_CI_AS` にする必要があります。
しかし、この状態ですと、cp932 の文字集合の範囲外の文字列は文字化けしてしまいます。

スマートフォンでよく使用される絵文字が文字化けしてしまうため、巷では、**寿司ビール問題** と呼ばれています。これ防ぐには、 [Nプレフィックスを付与する](https://blogs.msdn.microsoft.com/dsazurejp/2012/06/28/sql-azure-unicodencharnvarchar/) 必要があります。

以下のような修正で、 UTF-8 でのデータベース接続が有効になり、照合順序を `SQL_Latin1_General_CP1_CI_AS` としても文字化けせずに投稿できます。
もちろん、絵文字など、特殊な文字列の使用も可能です。

```utf-8.patch
diff --git a/wp-config.php b/wp-config.php
index a1a9449..7382888 100644
--- a/wp-config.php
+++ b/wp-config.php
@@ -36,7 +36,8 @@ define('DB_HOST', ( getenv('ProjectNami.DBHost') ? getenv('ProjectNami.DBHost')
 define('DB_CHARSET', 'utf8');

 /** The Database Collate type. Don't change this if in doubt. */
-define('DB_COLLATE', '');
+define('DB_COLLATE', 'SQL_Latin1_General_CP1_CI_AS');
+putenv('ProjectNami.UTF8=1');

 /**#@+
  * Authentication Unique Keys and Salts.
diff --git a/wp-includes/wp-db.php b/wp-includes/wp-db.php
index 409d4a8..afa56ff 100644
--- a/wp-includes/wp-db.php
+++ b/wp-includes/wp-db.php
@@ -1290,7 +1290,7 @@ class wpdb {
                $query = str_replace( "'%s'", '%s', $query ); // in case someone mistakenly already singlequoted it
                $query = str_replace( '"%s"', '%s', $query ); // doublequote unquoting
                $query = preg_replace( '|(?<!%)%f|' , '%F', $query ); // Force floats to be locale unaware
-               $query = preg_replace( '|(?<!%)%s|', "'%s'", $query ); // quote the strings, avoiding escaped strings like %%s
+               $query = preg_replace( '|(?<!%)%s|', "N'%s'", $query ); // quote the strings, avoiding escaped strings like %%s
                array_walk( $args, array( $this, 'escape_by_ref' ) );
                return @vsprintf( $query, $args );
        }
```

### See Also

- [Azure x EC-CUBE + WordPress + SQL Database で最強の EC CMS を構築しよう](http://qiita.com/nanasess/items/5f7ff1a3f030f85032cf)
- https://blogs.technet.microsoft.com/jpitpro/2016/01/27/project-nami-azure-sql-databasesql-server-wordpress/
Remixerを使ってデザイナーからモテモテのAndroidエンジニアになろう

ご無沙汰をしております。
[ノハナ社](https://nohana.co.jp/)で[フォトブック](https://nohana.jp/)と[年賀状](https://nenga.nohana.jp/)のAndroidアプリ開発を担当している[@seto_hi](https://twitter.com/seto_hi)です。

皆さん、[material.io](https://material.io/)見てますか？
StageとGalleryが使えるようになるのが待ち遠しいですが、
今回は [Remixer](https://github.com/material-foundation/material-remixer) の [Android版](https://github.com/material-foundation/material-remixer-android) 使い方解説です。

# なにができるの
アプリの実行中に動的な数値、色、文字の変更ができます。
ボタンクリックなどのイベントをトリガーとして、BottomSheetが出てきます。
例えばデザイナーが「どっちの色がいいか実機で見たい〜」って言い出した時に、「両方切り替えれるようにしておいたよ(ｷﾘｯ」ってできます。

![device-2016-12-14-125828.png](https://qiita-image-store.s3.amazonaws.com/0/103039/f6511782-7dbd-b9c5-aa15-8ddf097377c2.png)

# 導入
おおよそ[README](https://github.com/material-foundation/material-remixer-android) に書いてある通りです。

## 下準備
プロジェクトのルートの `build.gradle` でaptを導入します

```groovy:build.gradle
buildscript {
    dependencies {
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    }
}

allprojects {
    repositories {
        jcenter()
        maven { url "https://jitpack.io" }
    }
}
```

モジュール側でaptを有効にしてremixerの依存を追加します

```groovy:build.gradle
apply plugin: 'android-apt'

dependencies {
    compile 'com.github.material-foundation.material-remixer-android:remixer:0.5.2'
}
```

ApplicationでRemixerを初期化します

```java:MyApplication.java
public class MyApplication extends Application {
  @Override
  public void onCreate() {
    super.onCreate();
    //READMEだと以下のようになっているが、第一引数は不要
    //RemixerInitialization.initRemixer(Remixer.getInstance(), this);
    RemixerInitialization.initRemixer(this);
  }
}
```

## 実装

MainActivityではRemixerを表示するトリガーとなる条件を設定します。
今回はボタンにします。

```java:MainActivity.class
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button remixerButton = (Button) findViewById(R.id.remixerButton);
        RemixerBinder.bind(this);
        RemixerFragment remixerFragment = RemixerFragment.newInstance();
        remixerFragment.attachToButton(this, remixerButton);
    }
```

Remixerで設定された値をどのように使うかを定義します。
今回はボタンのテキストを変更します
RemixerBinderをActivityにBindした場合、アノテーションがついたメソッドが最低1つないと実行時エラーになります。

```java
    @StringListVariableMethod(
            title = "button text",
            possibleValues = {"hoge", "fuga", "piyo"})
    public void setText(String text) {
        Button remixerButton = (Button) findViewById(R.id.remixerButton);
        remixerButton.setText(text);
    }
```

リストからテキストを選択する以外にも以下のようなことができます。

- Integerの値をSeekBarで変更
- BooleanをSwitchで変更
- StringをEditTextで変更
- Integerをリストから選択
    - 色を切り替えるのに便利！

全部盛るとこんな感じです。

![device-2016-12-14-130404.png](https://qiita-image-store.s3.amazonaws.com/0/103039/115bf6ba-1825-c6e6-34f7-b84a76df7fc0.png)

# プロダクトで使えるか
無理。
BottomSheetが「Remixer」固定で変えられません。あくまで開発中に使うものです。
今回の記事の下準備の部分だけ実装しておいて、必要になったらActivity側を実装するというのが一番良い使い方かなと思います。

# 最後に
メソッドを追加するだけで簡単に値が変更できて便利なのでオススメです。
なお、Remixerを使ってもモテモテのAndroidエンジニアになれなかったとしても責任を負いかねます。
【Java】Mapの比較

#Mapの比較方法

・やりたいこと
リストAとリストBの比較を行い、どちらにもあるものとリストAにあるものだけ抽出したい
更新のときと新規のときで処理を変えたい


※2016/12/16：asahina_devさんの指摘を受けて修正しました。

```ruby:qiita.rb
/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        // MAP-A
        Map<String, String> listA = new HashMap<String, String>();
        listA.put("fruits","apple");
        listA.put("animal","cat");
        listA.put("sports","soccer");
        listA.put("drink","water");
        // MAP-B
        Map<String, String> listB = new HashMap<String, String>();
        listB.put("sports","soccer");
        listB.put("fruits","apple");
        listB.put("color","red");

        //Set<Map.Entry<K,V>>でまわしてリストBにもあれば更新、なければ新規
        for(Map.Entry<String,String> entry : listA.entrySet()){
            String key = entry.getKey();
            String val = entry.getValue();
            if(listB.get(key) != null){
                entry.setValue(val + "Koshin");
            } else {
                entry.setValue(val + "Shinki");
            }
        }   
        System.out.println(listA);
    }
}
```     
        

実際にはもっと複雑だったけど、簡易化するとこんな感じになった。
最初はリストCを用意しておいて共通した要素をリストCに放り込んで、リストA,Bからはその要素を削除していき、最後にリストAに要素が残っていれば新規としていれるって形にしたんだけど、iteratorで回してる時にその要素に変更を加えるとだめらしく、エラーが発生したので変更した。このほうがすっきりしてていいね。
Hiveで複数SQLの結果(各1行)を1行に

たまたまHiveでやってたけど考え方は普通だと思う
JOINするだけだし

```
SELECT * FROM
 (SELECT COUNT(*) AS count1 FROM table1) a
 JOIN
 (SELECT COUNT(*) AS count2, COUNT(DISTINCT col1) AS count3 FROM table2) b
```
mrubyのデバッグがしづらい問題をなんとかしたい

この記事は、[mruby Advent Calendar 2016](http://qiita.com/advent-calendar/2016/mruby)の12日目の記事です。
遅れてしまって申し訳ありません＞＜

mrubyを使い始めて3ヶ月ぐらいです。
mruby-cliでサーバー上で動くバイナリを作っています。
C側にはまだあまり手を出せてないですが、今作っているものは`.rb`ファイルだけでも20ファイルを超えて、ちょっとした規模になってきました。

せっかくmrubyスクリプトでバイナリを作れるのに、デバッグがしづらいなぁというのが今持っている印象です。
そこで、デバッグの方法としてどういった手段があるのかをまとめるとともに、あわよくば皆さんがどうしているのかを伺えれば、という思いで書いてみました。
ここでは、デバッグの対象はmrubyスクリプトのみとします。

## printデバッグ
基本でお手軽。
ただ効率としては決して良くはない。

## mrdb
http://forum.mruby.org/docs/dmanual.html
mruby公式のデバッグ機能。
ブレークポイントを設定できたり、ステップ実行できたりと魅力的な機能があります。
が、mrubyスクリプト(`.rb`)、もしくはそれをコンパイルしたバイナリファイル(`.mrb`)単品のデバッグしかできないっぽい。
なのでmruby-cliで作ったようなバイナリをデバッグするのはできない…のかな？

## nomitory
http://magazine.rubyist.net/?0050-nomitory
Eclipseのプラグインで、GUIでブレークポイントを設定できたりするらしい。
試してないけど、Eclipseというところでちょっと乗り気じゃない。

## mirb
バイナリとともに生成されるmirbには、使用しているmrbgemsや自作のコードも含まれています。
なので、そのあたりのクラスなどの挙動の確認するのに便利なケースがあります。

## ロガークラスを作る
print文を書いて消してしなくていいように、ロガークラスを作りました。コード中に書きっぱなしでも普段は機能しなくて、実行時に引数でデバッグモードを指定してやった場合にだけファイルにログを書き出すやつです。
処理の主要な部分と、例外発生時に来る部分とに入れておけば、比較的早く原因箇所が特定できます。
まだ作りが粗いので、整理してmrbgem化したい。

## 例外情報をAWS S3に上げてみる
デバッグというか、運用面を考えてのことですが、
例外発生時にAWSのS3に情報を上げる仕組みを作ってみました。
今は上げてるだけだけど、これをトリガーにしてslackに通知とかもできるはず。
ただ、本番環境で動いているものはビルド時にデバッグオプションを付けていないので、あまり情報量はない。。

## まとめ
今のところ自分が把握している/用意した手段はこのぐらいです。
ロガー作ったあたりから比較的楽になった気もしますが、もっといい方法が無いかと模索中です。

みなさんどうされているか、ご教授いただけると幸いです！
ぬくぬくReact学習記(1)

##Let's start!
今日からfacebookのtutorialでReactを勉強する。ちゃんとアウトプットもする。

## 最初のコード
```
class ShoppingList extends React.Component {
  render() {
    return (
      <div className="shopping-list">
        <h1>Shopping List for {this.props.name}</h1>
        <ul>
          <li>Instagram</li>
          <li>WhatsApp</li>
          <li>Oculus</li>
        </ul>
      </div>
    );
  }
}
```
JSでclassを使ったことがなかったから、いきなりちょっと面食らった。ES6からはJSでもclassはこういうふうな書き方になるんだね。prototypeなどを駆使してオブジェクト指向をやることはもうなくなるのかな。

- renderはReact elementオブジェクトを返す。
- `<div />`という書き方はJSXというシンタクス拡張。プリプロセッサによって、ECMAScriptへ翻訳される。`React.createElement`と等価。
- JSXの中には、{}で囲んでJavaScriptを書くことができる。

## ３つのコンポーネント
- Squreコンポーネントは、一つ一つのマス
- Boardコンポーネントは、9個のマス
- Gameコンポーネントは、○×の置き場所（ボード全体というようなことも書いてあって、Gameコンポーネントはこの段階ではちょっとわかりづらい、、、誤解しているかも）

をそれぞれrenderする。
Square < Board < Gameというように、階層的にコンポーネント化されている。**なんかすごくReactっぽい。（こなみかん）**

## コンポーネントの状態
- `{this.props.value}`でコンポーネント間で値の受け渡しができる。
- `onClick={() => alert('click')}`なんだこの書き方は、、と思ったら、これもES6からの新記法。匿名関数の省略型と考えて良いようだ。
- ハッシュの最後のカンマがOKになっている。いつから？？と思ったら、ECMAScript5からはOKで、IEの古いバージョンではエラーになる、ということのよう。

```
    this.state = {
      value: null,
    };
```

- コンポーネントの中では、this.stateにコンポーネントの状態を格納する。this.stateを書き換えることによって、コンポーネントの状態変化を表現する。（this.stateはコンポーネント内でprivateなプロパティ。）stateの変化は自動で子コンポーネントに通知され、子コンポーネントは再renderされる。**なるほど、楽しくなってきたぞ。**

今日はここまで。
[screen] いまアタッチしてるのどこだっけ...?

## こんなできごと

- リモートサーバに多段sshで作業してた
- あるスクリプトを動かしてた
- 思ったより時間が経っても処理が終わらず、タイムアウトで通信が切れてしまってた
- やってた処理は中断。Oh no....😱

心がけていたつもりでも、新しい環境だったり始めて動かすスクリプトだったりすると忘れちゃう。

## screenを使ったが

さて、心を入れ替えて、screenを使うようにしましたが。
「はて、今わたしが作業しているこのターミナル、screenつかってるんだっけ？どうだっけ？」と分からなくなることがあります。
すみません。。。

とりあえず落ち着いて。

```
bash-3.2$ echo $STY
21812.ttys001.mb
```

Ref. [Environment Variables - Screen User's Manual](https://www.gnu.org/software/screen/manual/html_node/Environment.html#Environment)
Ref. [Screen User's Manual](https://www.gnu.org/software/screen/manual/html_node/index.html)

## Screenを使うときの注意

- どこでscreenコマンドを実行すればいい？
　-　localhostじゃなくて、ssh / 多段sshしてる場合とかは、最終的に実施しているプロセスを落としたくないところで screen コマンドを利用すること^^;
tinyproxy

* 2MB

## docker-compose

```
touch tinyproxy.conf
```

```rb:tinyproxy.conf
User tinyproxy
Group tinyproxy
Port 8888
Timeout 600
DefaultErrorFile "/usr/share/tinyproxy/default.html"
StatFile "/usr/share/tinyproxy/stats.html"
LogLevel Info
MaxClients 100
MinSpareServers 5
MaxSpareServers 20
StartServers 10
MaxRequestsPerChild 0
ViaProxyName "tinyproxy"
DisableViaHeader Yes
ConnectPort 443
ConnectPort 563

Allow 192.168.xx.xx
Allow 192.168.xx.xx
```


```yaml:docker-compose.yml
proxy:
  image: tukiyo3/alpine-tinyproxy
  restart: always
  volumes:
    - ./tinyproxy.conf:/etc/tinyproxy/tinyproxy.conf
  ports:
    - "8888:8888"
```

## docker run

```rb:
docker run \
 -d \
 --restart=always \
 -it \
 -p 8888:8888 \
 tukiyo3/alpine-tinyproxy
# -v $(pwd)/tinyproxy.conf:/etc/tinyproxy/tinyproxy.conf \
```

```bash:proxy.sh
export http_proxy="http://ipaddr:8888/"
export https_proxy=$http_proxy
```

```sh:proxy経由での通信を有効にする
source proxy.sh
```

### yumのproxy設定

```diff:/etc/yum.conf
+ proxy=http://ipaddr:8888
```
Docker for Windowsで時刻がずれる場合


## 環境

- Windows 10 Pro build 1607
- Docker for Windows version 1.13.0-rc3-beta32.1(9324) Channel: Beta

## 時刻同期ずれ

最初に確認出来たのはS3へオブジェクトをアップロードする際にサーバ時刻とずれがあるのでアップロード出来ないというエラーだった。

`date`コマンドで確認したところUTC+９時間が現在のUTCとして認識されていた。

これを直すにはHyper-VマネージャーからDocker for Windows用に作成されたMobyLinuxVM→設定→統合サービスで時刻の同期をオンにする必要がある

![image](https://qiita-image-store.s3.amazonaws.com/0/47983/f0f48565-a19f-3d6a-915d-9be78015dc6b.png)

他にもファイルシステムの時刻を見てビルドするツール(gulp, webpack等のwatcher)はこの時刻同期のバグによりDocker for Windows上でビルドが走らない場合があるので有効にする必要がある
WordPressのXSS脆弱性をVAddyで検出してみる

VAddyは、[継続的なWeb脆弱性診断が簡単に実現できるSaaSです](https://vaddy.net/ja/)。

昨日はVAddyの基本的な使い方を説明しました。
[10分でWebアプリの脆弱性検査ができた！VAddyでWordPressをスキャンしてみる](http://qiita.com/ichikaway/items/1ca084d86bd2f3810daa)

たった3ステップで脆弱性診断が手軽にでき、特別な知識が不要だと感じてもらえたら嬉しいです。
VAddyではWebAPIの提供やJenkinsプラグイン、 CLIツールなどCI連携ツールの提供もしていますので、簡単に継続的なセキュリティのチェックが行えます。

今日は昨日の記事でスキャンしたWordPressにクロスサイトスクリプティング（XSS）の脆弱性を入れて、同じようにVAddyで検査してみたいと思います。

## WordPressにXSSの脆弱性をあえて入れる

VAddyに登録した検査対象のページは、WordPressの検索フォーム画面でした。この画面にXSSが発生するようにしたいと思います。
利用したのはWordPress 4.7と、デフォルトでインストールされているテーマ`TwentySeventeen`です。

![before-xss.png](https://qiita-image-store.s3.amazonaws.com/0/61278/d7bbbd6b-fa9e-7db3-3b3d-3f6c04708911.png)


この画面のテーマファイルは、`wp-content/themes/twentyseventeen/search.php`です。

このファイルの`</header>`タグの後に、検索文字列をエスケープせずに表示するコードを入れてみます。

```php
<?php get_header(); ?>

<div class="wrap">

        <header class="page-header">
                <?php if ( have_posts() ) : ?>
                        <h1 class="page-title"><?php printf( __( 'Search Results for: %s', 'twentyseventeen' ), '<span>' . get_search_query() . '</span>' ); ?></h1>
                <?php else : ?>
                        <h1 class="page-title"><?php _e( 'Nothing Found', 'twentyseventeen' ); ?></h1>
                <?php endif; ?>
        </header><!-- .page-header -->


　　　　　　　　　　　　　　　　<!-- ここにXSSを追加 -->
        XSS Test: <?php echo get_search_query($escape=false); ?>  <br/><br/>
```

最後の行の `XSS Test:` から始まるコードがそれです。検索ワードを`escape=false`で表示しています。

試しに検索キーワードに `<font color="red">aaaa</font>` を入れて検索ボタンを押すと、下の画面のように赤い字のaaaaが表示されます。fontタグがそのまま処理されていますね。

![after-xss.png](https://qiita-image-store.s3.amazonaws.com/0/61278/5612b98c-13dd-58ad-6ff1-8184fcded11c.png)


## VAddyで検査を実行してみる

[昨日の記事](http://qiita.com/ichikaway/items/1ca084d86bd2f3810daa)で行ったスキャンをもう一度実行してみます。

VAddyの左メニューのスキャン画面に遷移して、Start Scanボタンを押して検査を実行し、20秒ほど待つと下記の画面が表示されました。

![スクリーンショット 2016-12-14 23.06.15.png](https://qiita-image-store.s3.amazonaws.com/0/61278/32c04e1d-fb39-0225-3182-c36dd7eb9483.png)

同じ画面を検査しましたが、今回は1つ問題を発見したため、赤いラベルで`1 Problem`と表示されます。
これをクリックして詳細な問題を見てみます。

## 検査結果の詳細

![スクリーンショット 2016-12-14 23.09.17.png](https://qiita-image-store.s3.amazonaws.com/0/61278/0d914f3d-5678-9b80-2ace-b477bb1229fb.png)

この画面では上部は検査の種類や検査リクエスト数、利用したクロール情報が表示されます。
重要なのは赤い四角で囲った箇所です。

- 脆弱性の種類 (クロスサイトスクリプティング)
- 該当URL (/?s=test)
- 該当パラメータ( s )

が表示されています。この情報を元に、GETのパラメータsの値を表示しているViewファイルの箇所を探してエスケープ漏れを修正します。（今回は自分でXSSコードを入れてるので修正はしません）

一番右の、「Response」というボタンをクリックすると、検査の時の実際のレスポンスデータが表示されます。XSSの場合はhtmlの該当箇所が黄色くハイライトされているため、修正する箇所の特定も容易になります。
![スクリーンショット 2016-12-14 10.48.22.png](https://qiita-image-store.s3.amazonaws.com/0/61278/4ac24a93-d6f9-c430-bafa-0903a81d2b24.png)

## さいごに

今回はWordPressを題材に実際にXSSの問題を検出してみました。
SQLインジェクションやコマンドインジェクションも入れてみると楽しいかと思います（非公開サーバで）。
VAddyはログイン後の画面の検査も可能ですので、あとは自分が作っているWebアプリケーションで検査してみましょう！
https://vaddy.net/ja/

### ビールネタ
12月になりすっかり冬ですね。冬といえば、よなよなリアルエール！
ハンドポンプで入れるビールは、口当たりがスムーズで香りもあって非常に美味しいです。
一般的なビールよりも温度設定が少し高いので、冬に飲みたくなりますね。
都内であれば、よなよなビアキッチンに行けば飲めると思います。福岡なら、私がよく行くガストロパブエールズで飲めます！
畳み込みカーネルの半正定値性チェック

経験則を用いたチェック
Nとdを任意の値に設定して、任意の回数繰り返す。

```python:checkpositivesemidefinite.py

import numpy as np 

def possemicheck(X,C):
    N = len(C)
    K = np.empty([N,N])
    summe = 0
    for i in range(N):
        for j in range(N):
            K[i][j] = np.linalg.norm(np.convolve(X[i],X[j]))**2
            summe = summe + (C[i]*C[j]*K[i][j])

    if (summe>=0):
        output = True
    else:
        output = False
    return output, summe

N = 300 # データセットの数
d = 200 # データセットの次元
ite = 10 #繰り返しの回数
a = 1
for i in range(ite):
    X = np.random.randn(N, d) 
    C = np.random.randn(N)
    output, summe = possemicheck(X,C)
    print summe
    a = a * output
if (a==True):
    print("the kernel is positive semi-definite")
else:
    print("the kernel is not positive semi-definite")
```
数学的証明
![Bildschirmfoto3.png](https://qiita-image-store.s3.amazonaws.com/0/155002/4a29cd47-eb06-116f-5a86-8410067cfb96.png)


```tex:possemidef.tex
\documentclass{amsart}
\usepackage{pdfpages}
\title{Possemidef}
\begin{document}
Covolution Kernel\\ 
Let $x$, $x'$ be two univariate real-valued discrete time series.\\
\begin{eqnarray*}
k(x,x') = || x \ast x'||^2
\end{eqnarray*}
\\
Proof that the convolution kernel is positive semi-definite: \\
\begin{eqnarray*}
\sum_i \sum_j c_i c_j k(x_i, x_j) \geq 0 \ \ \ \ c_i, c_j \in \mathbb{R}
\end{eqnarray*}
\begin{equation*}
\left.
\begin{array}{r@{\;}ll}
\sum_i \sum_j c_i c_j k(x_i, x_j) & = \sum_i \sum_j c_i c_j || x_i \ast x_j||^2 &\\
&=\sum_i \sum_j c_i c_j \sum_t(\sum_{\tau} x_i(\tau)x_j(t-\tau) )^2 &\\	
&=\sum_i \sum_j c_i c_j \sum_t(\sum_{\tau} x_i(\tau)x_j(t-\tau) )(\sum_{\tau'} x_i(\tau')x_j(t-\tau') )& \ \ \ | \ \ x_i * x_j = x_j * x_i  \ \ \  \\
&=\sum_i \sum_j c_i c_j \sum_t(\sum_{\tau} x_i(\tau)x_j(t-\tau) )(\sum_{\tau'} x_j(\tau')x_i(t-\tau') )& \\
&= \sum_t \sum_i \sum_j c_i c_j \sum_{\tau}\sum_{\tau'} x_i(\tau)x_j(t-\tau) x_j(\tau')x_i(t-\tau')& \ \ \ |s = t - \tau -\tau' \\
& & \ \ \ |t - \tau = s + \tau' \\
& & \ \ \ |t - \tau' = s + \tau \\

&=\sum_s \sum_i \sum_j c_i c_j \sum_{\tau}\sum_{\tau'} x_i(\tau)x_j(s+\tau') x_j(\tau')x_i(s+\tau) & \\
&=\sum_s \sum_i \sum_j c_i c_j \sum_{\tau}\sum_{\tau'} x_i(\tau)x_i(s+\tau) x_j(\tau')x_j(s+\tau') & \\
&=\sum_s (\sum_i \sum_{\tau} c_i x_i(\tau)x_i(s+\tau))( \sum_j \sum_{\tau'}c_j x_j(\tau')x_j(s+\tau')) & \\
&=\sum_s (\sum_i \sum_{\tau} c_i x_i(\tau)x_i(s+\tau))^2 \geq 0
\end{array}
\right\}
\end{equation*}
\end{document}
```
.gitignore

## .gitignoreで無視するファイル・ディレクトリを指定する
gitで無視するファイルやフォルダのパターンを記述する

###形式
|項目|書き方|
|:-:|:-:|
|コメント|#を行の先頭につける。文字列の後につけてもコメントにならない|
|ファイル名|ファイル名を指定すると全てのディレクトリのファイル名が無視される|
|ディレクトリ名|末尾に/を付加することで全てのディレクトリ、サブディレクトリに存在するディレクトリが無視される
|ワイルドカード|＊を使用することでシェルのグロブパターンとして展開される　[グロブパターン](http://qiita.com/ingktds/items/b28792c559d774b76a87)|
|反転|行頭の！は行の残りの部分の意味を反転します。これ以前に設定されたルールにマッチしたものは再び含まれる|

###除外パターンを自分の環境のみに適用する
通常.gitignoreはファイルとして認識され、クローン時にコピーされる。
何らかの理由によって自分以外の環境に適用すべきではない場合
.git/info/excludeファイルにパターンを書くべき
このファイルの形式は.gitignoreと同じである。
技術英語 > Because small parts of a program usually consume [a disproportionate share of] the run time,

@ Code Complete (No. 19561 / 36077)

> Because small parts of a program usually consume **<font color=red>a disproportionate share of</font>** the run time, ...

https://www.merriam-webster.com/dictionary/disproportionate
> being out of proportion <a disproportionate share>

意訳「プログラムのわずかな部分が(その小ささにかかわらず)不釣り合いなほどの実行時間を必要とする」
(年明けから)Pythonと共にNimを学ぶ。

<font color="Blue">
本日は、実務でC++/objective-cを淡々と使っていたり，Pythonistaだったりする兄貴たちに向け、Nimと共にPythonを学んでいる自分のメモ書きを晒す。
...年明けから、Python+Cで，デカいデータを相手にする仕事するんですよね。nim使ってもバレなそうな気もちょっとしていて、ありがたや、ありがたや。
</font>

# コンパイル言語Nim(旧Nimrod)の特徴をひとつ

2008年頃から開発が続く、旧NimrodことNim。
Python使いの人にその特徴を捉えてもらうには、wikipedia日本語版のnimのところに記されている以下のコードを見ていただくのが良いのではないかと考える。

```wikipedia.nim
proc reverse(s: string): string =
  result = "" # 暗黙的なresult変数
  for i in countdown(high(s), 0):
    result.add s[i]

var str1 = "Reverse This!"
echo "Reversed: ", reverse(str1)
````

wikipediaの解説を少し噛み砕くと :

- 暗黙的なresult変数に注目。Nimでは、returnの型がvoidではないプロシージャは、暗黙的なresult変数を持つ。result変数はプロシージャの返り値を保持している。
- forループでのcountdownはイテレータである。ここでは、high(s)により得られる文字列長から0へと、１ずつカウントダウンされるイテレータが記述されている。

Nimは型ありコンパイル言語ながら、スクリプト言語っぽく書くことができる。

国内でNimが知られ始めたのは、Takano32氏による「Nimrod で FizzBuzz を書こう！」という５年ほど前のブログあたりからではないかと考えられる。

- http://takano32.blogspot.jp/2011/12/nimrod-fizzbuzz.html

RubyコミッターであるTakano32氏は、その後、さっそくに「なんと Nimrod で Python が使えるの！？」というエントリーを投稿している。

- http://takano32.blogspot.jp/2011/12/nimrod-python.html


そう、pythonとnimとを併用しようという人々はけっこういる(rubyとnimとの関係はどうなんだろ？)。

ということで、今回は、pythonからnimを呼び出してみて、その使いどころを考えておきたい。

<font color="Blue">
*で、馬並み、でなくてＣ言語並みの実行速度を持つnimに興味を持ったpython使いの方々は、nimのソースコードと本家のドキュメントなとをガンガン読み解いて、ブログにアップしてください。私が助かる^_^*
</font>

#pythonからnimを呼び出す。

基本的なところは、[Connecting Nim to Python](http://akehrer.github.io/posts/connecting-nim-to-python/)に従えば、あっという間。
やっていることは、nimのソースコードから、C言語のいわゆる共有ライブラリを作り出すこと。バイナリは実行環境依存となる。以下、Macでの事例。xcodeと最新のbrewが入っている環境ならば、nimのインストールは以下だけで良い。
> brew install nim

まずはプロシージャ(関数)ひとつだけのnimコードを用意し、

```fn1.nim
proc summer*(x, y: float): float {. exportc, dynlib .} =
  result = x + y
```

以下で、共有ライブラリ化する。
> nim c --app:lib fn1.nim

生成されたlibfn1.dylibを呼び出すpythonコードは以下となる(Macに最初から入っているpython2.7を使用)。C言語の共有ライブラリ呼び出しなので、ctypesを使う。

```py2nim1.py
from ctypes import *

def main():
    test_lib = CDLL('./libfn1.dylib')

    # Function parameter types
    test_lib.summer.argtypes = [c_double, c_double]

    # Function return types
    test_lib.summer.restype = c_double

    sum_res = test_lib.summer(1.0, 3.0)
    print('The sum of 1.0 and 3.0 is: %f'%sum_res)

if __name__ == '__main__':
    main()
```

64bit環境ではdouble型にするのに注意すれば、『4.0』という答が，nimから得られる。

# 使い所は，例えば社内のバッチ処理システムなど、か。

numpy, pypy, micropython, R18python...などなど卑猥なでなくて、実行速度を追い求め専門的なpy用語が飛び交う環境ならば、nimはすんなりと溶け込めるかもしれない。
そうでなくとも、『おい、お前、これを見ろ。こいつをどう思う』--「すごく、大きいです...(計算量的に)」といった環境が目の前にあるならば、python+C系言語+nimで、処理に挑むのはありうる話だと思われる。

マイナー言語であった20年くらいから，猛者たちによって無数のコードが書かれてきたpythonには，さまざまな『芸』がある。例えば、Mac環境にはPyObjCなるObjective-c(++)の呼び出しライブラリが入っていて、pythonでObjective-cで書かれたGUIを呼び出しつつ、nimも呼びだすなんてことがすぐにできる。
python側のGUI呼び出し記述が長いので、コードはgistに置いておく。

- https://gist.github.com/kmry/d876ea7995978eecddea09bda0244316

実行例:
![スクリーンショット 2016-12-15 05.12.54.png](https://qiita-image-store.s3.amazonaws.com/0/16455/570237e1-e356-1484-c5e4-1f15243dcc33.png)

nimで書かれた計算ライブラリを呼び出すユーザー向けのGUIを作り出すなんてのは、pythonを使えば、手間がぐっと減る。コンパイル言語であるnimは、適宜、親和性の高いC/C++を呼び出すデータ処理記述に専念できるわけだ。

#続く

...と、今はネタ言語にとどまるnimについて、割合と常識的なことを書いてしまった。が、兄貴、ご安心を。これを出発点に、近々、IoTをお題としたネタ投稿を書きまする。
gdbを初心者に教える最初のステップ

gdbを使える人、gdbを使えない人(あまり使ったことがない人)が居るチームの中で、後者に対してどうやってgdbを身につけてもらうか、を考えました。教える側の目線です。

#初めに注意すること
##コマンド一覧をいきなり覚えない、覚えさせない
コマンド一覧を渡して使ってみてね、はやらない。初心者は何から覚えて何をやればいいのかわからなくなる。厳選してもダメ、何のために使うか、という目的と一致しないとなかなか覚えられない。

##emacsで使うようにする
listでソースコードを表示させる、を覚えるくらいならemacsで使えるようになった方がよい。
emacsを開いた後

```
M-x, gdb [Enter]
プログラム名
```

#実践する
##Segmentation Faultするプログラムをデバッグする
無ければサンプルプログラムを作ればよい。

###そのまま走らせてSEGV停止させてみる

```
(gdb) r // 実行
↓
SEGV発生
↓
(gdb) bt // バックトレース表示
↓
(gdb) up // 1階層上へ。逆はdown
↓
(gdb) p 変数 //変数内容を表示。p/xとすると16進表示
↓
(gdb) q // 終了
```
あたりをやる。

### SEGV前にbreakさせてみる
SEGVになる直前やその原因を作ったと思われる関数にbreak pointを張る。
ここで覚えるのは以下

```
// break関連
(gdb) b // 現在位置にbreakを張る。rで再実行したらそこで止まる
(gdb) b func // 関数funcの入り口にbreakを張る
(gdb) b xxx.c:123 /// ソースファイルの指定行にbreakを張る
emacsでCtrl+space カーソルがある行にbreakを張る
 
// その他コマンド
(gdb) n // 次の実行行へ。関数があったら中に入らない
(gdb) s // 次の実行行へ。関数があったら中に入る
(gdb) p value=xxx // valueにxxxを入れる。SEGVにならない変数に書き換えたり
(gdb) c // 現在位置から再実行
// 場合によっては使う？
(gdb) u // ループからなかなか抜けられない時に
```

#補足
省略したが以下は押さえておく。
・gccでコンパイルするときは-gオプション
以下も実行環境によっては必要
・SIGUSR1などで止まる場合は.gdbinitに無視する記述を追加(予め配布する)

#最後に
個人的にはこれで十分使えてますし、以降は「じゃあこういうことは出来ないのか？」ということになり、自分で調べるか聞いてくるか、になると思います。
PhpStormおすすめプラグイン3選

「そうだ、PhpStormを使おう。」

ということで思い立ち(？）今年から僕のPhpStormライフが始まりました。
やっぱねー、PhpStormは良いんですよ。便利なんですよ。
もー開発に手放せません。

ただプラグインを使うと、より便利に、より快適に開発することが出来ます⭐️
そんなわけでいってみましょう。PhpStormプラグインおすすめコーナーァァ:point_up:・・・・あ、遅れましたが[PHP Advent Calendar 2016](http://qiita.com/advent-calendar/2016/php) 15日目のエントリです:santa:

#Scratch
プロジェクトとは関係なく、一時的にコードや文章をメモしておきたい時があります。
Scratchプラグインを導入することで、プロジェクトとは関係のない場所でメモ書きが可能になります。

![scratch1.gif](https://qiita-image-store.s3.amazonaws.com/0/71113/ef065cd6-730d-6865-5beb-bc0eb1dfe48d.gif)

一度作ってしまえば違うプロジェクトを開いても呼び出せます。
![scratch2.gif](https://qiita-image-store.s3.amazonaws.com/0/71113/94da13a4-c47f-0d30-f873-8e33b86fbf58.gif)

もちろんプレーンなテキストだけじゃなく様々な言語で書けます。
![scratch3.gif](https://qiita-image-store.s3.amazonaws.com/0/71113/3195564a-c315-7ad7-4912-b0758ca6d218.gif)

個人的には一番おすすめのプラグイン！ :thumbsup: 
#String Manipulation
変数やメソッド名のキャメル:left_right_arrow:スネークケース変換が出来ます。
例えばコーディング規約では変数はキャメルケースなのに、スネークケースになっているコード(逆もしかり)は多々あります。
そんな時リファクタリングするのをついためらってしまいますが、このプラグインとPhpStormのRename機能を組み合わせることで、漏れなく一瞬で行えます。

まずプラグイン導入後はケース変換をショートカットキー設定しておきましょう。
設定はキャメルケース/スネークケースへの変換共に同じキーにしておいた方がわかりやすいです。
![image](https://qiita-image-store.s3.amazonaws.com/0/71113/1e3d2008-56a3-52fd-76b1-a97d2a22b74b.png)


では実際にコードでケース変換のリファクタリングを行ってみましょう
変更したい変数名にカーソルを当ててRename、その後にケース変換のコマンドを実行します。

![scratch4.gif](https://qiita-image-store.s3.amazonaws.com/0/71113/ab275fc5-4ba3-a8d9-5e29-72188050e753.gif)

一瞬で完了！リファクタがかなり楽になりました・・！

#SmarterEditor
痒いところに手が届くとはこういうことかと思ったプラグイン。
現在の位置のコードブロック選択、先頭・末尾への移動が可能になります。

まずはこちらをご覧ください。
![smarterEditor1.gif](https://qiita-image-store.s3.amazonaws.com/0/71113/442e2d12-e890-ba1f-40a0-eb62fb6938eb.gif)

お分かりでしょうか？
804行目のカーソル位置で「Select favourite」というコードブロック選択のコマンドを実行すると、最も内部のコードブロックである`if (isset($codes[$status])) {…`が選択されます。
さらにその状態から連続で実行すると一つずつ外側のコードブロックまで選択範囲が広がります。

今までコードブロック選択をする時Shift押しながら一行ずつ選択していた方は、このプラグイン地味に便利なのでおすすめです:grinning:



ということでPhpStormおすすめのプラグイン3つを紹介しました:writing_hand: