OmniAICreator/Qiita-1.07M huggingface dataset:
LineとSlackが合体した話

この記事は[CyberAgent 20新卒 Advent Calendar 2019](https://adventar.org/calendars/3976) の25日目になります！

メリークリスマス！

# 概要
僕が研究の際に作ったシステムを紹介したいと思います。

簡単に言うと、LineBotとslackBotを結合したアプリを作りました。

lineとslackで同時に物事を共有できるアプリです。

# デモ
https://drive.google.com/open?id=1p0SRB4k_BVIeX34xraqG4QOPJDvee5W1

↑ デモ動画です〜


# Line側
[Line Developer](https://developers.line.biz/)サイトにて、Line Bot作成。
ここのリクエスト先を自作アプリのAPIに向ける

https://developers.line.biz/console/channel/自分の作成したLineBotのID/messaging-api
↓
Webhook settings
↓
Webhook URL に設定

# Slack側
* SlackのWebhookURLを用意
* Slashコマンドを作成(https://api.slack.com/apps/自分の作ったSlashコマンドID/slash-commands?)
* Slashコマンドのリクエスト先を自作アプリのAPIに向ける

# 自作アプリ
自作アプリの簡単な紹介をします

## 環境
* python3.7
* Heroku


## 必要なpythonライブラリ
* slackweb
* flask
* linebot

## code
### 1. Lineのcallbackを処理して、Lineにレスポンス

* 処理

```python
@app.route("/callbackline", methods=['POST'])
def callback():
    signature = request.headers['X-Line-Signature']

    body = request.get_data(as_text=True)

    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)

    return 'OK'
```

* レスポンス

ここは、Lineからきた処理をSlackに送っている

```python
@handler.add(MessageEvent, message=TextMessage)
def response_message(event):
    try:
        sourceGroup: SourceGroup = event.source
        userId = sourceGroup.user_id
        text: str = event.message.text
        # 細かいところは長くなるので省略しました
        attachments = [{
            "color": "#0000FF",
            "title": "LINEから通知されました",
            "text": '<!here>\n' + text
        }]
        profile = line_bot_api.get_profile(userId)
        slack.notify(attachments=attachments,
                         username=profile.display_name, icon_url=profile.picture_url)
    except Exception as e:
        print(e)
        raise
```

### 2. slackのcallbackを処理
ここは、slashコマンドで送られてきた処理をLineに送っている

```python
@app.route("/callbackslack", methods=['POST'])
def callbackslack():
    '''
    * SLACK_VERIFICATION_TOKEN
    * LINE_GROUP_ID
    この辺は自分で設定
    '''
    if not request.form['token'] == SLACK_VERIFICATION_TOKEN:
        return
    try:
        user_name = request.form['user_name']
        slackMessage = request.form['text']
        toLineText = '【' + user_name + '】 ' + slackMessage
        line_bot_api.push_message(LINE_GROUP_ID, TextMessage(text=toLineText))
        # 細かい処理は長くなるので省略しました
    except Exception as e:
        print(e)
        raise
```

# おわり
本当はクリスマスの投稿記事なので、クリスマスっぽい事したかったですが思いつかなかったので（笑）

このアプリで、エンジニア職とビジネス職とのコミュニケーションを繋ぐ**架け橋**になれれば良いですね！！！（名言）

それでは、良いクリスマスを！！！🎄
XPS 15 7590にUbuntu 18.04をインストールした時のメモ

2020/02/10 19.10から18.04に入れ直しました。

## OSインストールまで
### BIOSの入り方
電源入れてPOST画面でF2
(今はBIOSじゃなくてEFIって言ったほうが正しい？)

### BIOSの設定
AHCIにする
Secure Bootを無効にする
Fast BootをThoroughにする

### ブートデバイスの選択
電源入れてPOST画面でF12

### OSインストール
safe graphics modeでインストールする

## インストール後の設定など
### 日本語入力
Language Supportを開くと不完全な言語環境がうんたらかんたらって出るのでインストール。
再起動後、SettingsのRegion & LanguageのInput SourcesからMozcを追加できる。
Mozc追加後、再度再起動したらMozcが有効になってる。

### CapsLockをCtrlにする
```
gsettings set org.gnome.desktop.input-sources xkb-options "['ctrl:nocaps']"
```

### スリープがおかしい
スリープはするけど復帰しない。
Arch Wikiの[ココ](https://wiki.archlinux.org/index.php/Dell_XPS_15_7590#Suspend)を参考。
設定後に下記コマンドを実行して設定ファイルを再生成するのを忘れずに。

```
$ grub-mkconfig -o /boot/grub/grub.cfg
```

### タッチパッドでマルチタッチジェスチャ
[libinput-gestures](https://github.com/bulletmark/libinput-gestures)でできる。

### 2本指で右クリックメニュー
Ubuntu SoftwareからGNOME Tweaksをインストール。
Keyboard & MouseにあるMouse Click EmulationをFingerにするとできる。

### 2本指スクロールで慣性スクロール
できない

### 指紋認証リーダー
使えない

### アンチウイルス
[Sophos Anti-Virus for Linux](https://www.sophos.com/ja-jp/products/free-tools/sophos-antivirus-for-linux.aspx)をインストールしてみた。

### Bluetoothヘッドホン(apt-X)について
後で書く。
参考: https://blog.katio.net/page/linux-bluetooth

### GPUに関して
XPS 15(7590)はNVIDIA GeForce GTX 1650とIntel UHD Graphics 630の排他制御。
Ubuntuをインストールした時点でGeForceのドライバは当たってる。
(インストール時にサードパーティーのソフトウェアをうんぬんかんぬんのチェックを入れる必要があるかも。)

ドライバの設定画面で、
- 常にGeForceを使用する
- 常にGeForceを使用しない(常にIntel UHD Graphics 630を使用する)
の選択ができる。
自動切り替えはできずGeForce常時ONか常時OFFの2択。

### HiDPIに関して
100%/200%/300%/400%しか選べない。
xrandrで150%とか選べるみたいだけど試してない、そしてGeForceが有効な場合は↓の問題にぶち当たる。

### マルチディスプレイ時のHiDPI
私の環境は本体の4Kディスプレイに加えて4Kの外部ディスプレイを繋げてます。
Arch Wikiの[ココ](https://wiki.archlinux.jp/index.php/HiDPI#.E5.A4.96.E9.83.A8.E3.83.87.E3.82.A3.E3.82.B9.E3.83.97.E3.83.AC.E3.82.A4)に、

> ノート: 上記の --scale 2x2 は一部の Nvidia カードでは機能しません。現在のところ解決方法は見つかっていません [6]。nvidia-settings を使って CurrentMetaMode で ForceFullCompositionPipeline=On を設定することで一時的に回避することができます。詳しくは [7] を参照。

と書かれているようにGeForceを使用している状態ではスケーリングが上手く動かない。
100% or 200%だと問題ないけどそれ以外にすると実画面に対してデスクトップがはみ出て表示される。
一時的な回避方法はまだ試してない。(2019/12/25時点)

# CPUの温度取得
lm-sensors使う、後で書く。

# ファイルマネージャで動画ファイルのサムネイル表示
ffmpegthumbnailer使う、後で書く。
ヘルプデスクから人材コンサルタントになりました

#自己紹介
僭越ながら、ランスタッドアドベントカレンダー最終日に出稿をさせて頂くことになりました。昨年のアドベントカレンダーから拝読してくださった方は大変ご無沙汰しております。
昨年の記事をレビューしたい方は、こちらからお願いします！
・[IT未経験者がサーバーOSの違いを調べたお話](https://qiita.com/Okachan-Honpo/items/1e92c16299a0ce7ff3df "IT未経験者がサーバーOSの違いを調べたお話")
・[IT未経験なのに2万のキーボードを買ってイシキがタカイタカイになった話](https://qiita.com/Okachan-Honpo/items/1d52a338bad35657baf0)

#ヘルプデスクで学んだ1年
社内のN/W周りの整備から社内のPC周りのトラブルシューティングを中心にヘルプデスク業務に携わりました。緊急性の高いN/W不調やPCの故障など多くの課題を迅速に対応するSkillとコミュニケーション能力のレベルがあがりましたね。(自画自賛)

~~だから俺だってなにかしなくちゃあな・・・かっこ悪くてコンサルタントに異動できねーぜ~~

ということで・・・
###IT未経験がキャッチアップするために学習した参考文献
・[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/)
・[IT用語図鑑ビジネスで使える厳選キーワード256](https://www.amazon.co.jp/IT%E7%94%A8%E8%AA%9E%E5%9B%B3%E9%91%91-%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E5%8E%B3%E9%81%B8%E3%82%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%89256-%E5%A2%97%E4%BA%95-%E6%95%8F%E5%85%8B/dp/4798160016)
・[3分間Networking](http://www5e.biglobe.ne.jp/aji/3min/)


#人材コンサルタント始めました
~~JOJO 俺の最期の投稿だぜーー受け取ってくれーー~~
ヘルプデスク経験を活かしてコンサルタントに転身しました。
自分のように転職をして、人生がいい方に好転した！そういう気持ちをCXに落とし込むにはコンサルタントになるのがいいんじゃないかと思い、社内異動を決意。
社内SEを中心としたエンジニア領域のコンサルタントとして、来年より始動します。
・[非エンジニアがエンジニア領域の理解を深めるには・・](https://note.com/chake0211/n/nbf48932cc232)
・[この方のブログは勉強になる](https://note.com/potentialight/n/nbd9c7066273f?creator_urlname=potentialight)

#終わりに
転職したい人はランスタッドを使おう！(ダイレクトマーケティング)


<img width="375" alt="unnamed.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316274/135f1caa-0fb6-5155-01fb-6bcc17550236.jpeg">
【総まとめ】EtherCATについて語る Advent Calendar 2019【追記】

この記事は [EtherCATについて語る Advent Calendar 2019](https://adventar.org/calendars/4097) の25日目です。

#メリークリスマス！！

みなさま、最終日までご協力有難うございます！！

何とか無事に２５日目を向かえました！
途中色々ありましたが、自分も含めて**初めてな事**でして、目をつぶって頂ければと思います。

<img width="1021" alt="スクリーンショット 2019-12-25 17.00.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/592b417a-86ac-e623-d6f5-513242c3c327.png">


ホントね、感謝感激ですよ。ほぼ４名で２５日分回せました。

最初は自分一人で２５日回す！と思っていましたが、連続して記事を書くしんどさが分かり、間あいだに入って頂き誠に有難うございます。大変助かりました。

EtherCATというニッチなアドベントカレンダーも完走する位、**注目された規格**ですよ？！

#クリスマス・デモストレーション

▶︎ 動画だよ！
[![画像がここに入る](http://img.youtube.com/vi/h581Zhksj3M/0.jpg)](http://www.youtube.com/watch?v=h581Zhksj3M)

今日の為に色々と準備をしてまえりました！

総台数14台を連結し！！
更に１箇所だけLANケーブルを50メートルにし！！
兎に角、パラパラと光らせることに注力したデモストレーション！！

年に１回しか見ることが出来ません！！！

あと、何かBGM探してたら、過去に自分が作った音源が出てきたので組み合わせてみました！！

因みに、去年の動画はこちら。

▶︎ 動画だよ！
[![画像がここに入る](http://img.youtube.com/vi/IJ3wDZTYThs/0.jpg)](http://www.youtube.com/watch?v=IJ3wDZTYThs)

2018年は10台でしたが、2019年は14台まで試せました！！


#本日の記事

さて、本日の記事は・・・来年の話！

無事にアドベントカレンダーも終え、EtherCATが**ニッチな規格ではない！**と認知されたんじゃないでしょうか。

ビュー数も、自分の所ですが、多いものでは800を超え、平均をとっても１００を超えています。

有り難いことに、EtherCATのネタであれば**誰もが気になる情報**なのです。（大きく言いました）

そんな、期待されているEtherCATですが・・・・

<font color="OrangeRed">2020年は、**一般ユーザー向けのEtherCATイベント**を開催したいと思います！！</font>

EtherCATにはETGというグループがありますが、ETG会員限定のイベントしか無く、**そもそもEtherCATって何なのか知らないのに会員にならんでしょ！**って事もあり、また自分のように事業ではなく研究開発に使用したい方にも参加出来るよう**一般ユーザー（垣根なし）によるEtherCATイベント**を開催したいと思います！！

開催日は未定ですが、２月か３月に調整したいなぁと思っています。
場所は**東京**を予定しておりますが、変更がある場合もあります。
スポンサーや会場を貸して頂ける方も募集中です。

なるべく**土日祝日開催**を行いたいと思います。
ここはチョットしたこだわりで頑張りたいです。

- <font color="DodgerBlue">2020年に一般ユーザーイベントを開催します！</font>
- <font color="DodgerBlue">日程は未定ですが、２月３月を目標に動きます！</font>
- <font color="DodgerBlue">場所は東京都内を目標に動きます！</font>
- <font color="DodgerBlue">土日祝日開催に成ると思います！</font>

そんな事で、2020年もよろしくお願いいたします！！！

# 自分自身の来年の目標

さて、自分自身の来年の話ですが、正直行って１月から幸先は悪いです。
主に金銭面で悩むことが多い一年だと思います。
だけど、今の自分には何とかEtherCATがあるので、コレを大事に育てていきたいと思います！！

- <font color="ForestGreen">LAN9252+マイコンをマスターする！</font>
- <font color="ForestGreen">EEPROM周りを整理する！</font>
- <font color="ForestGreen">ETGに製品広告を出す！</font>
- <font color="ForestGreen">SOEMのPython版 PySOEMの使い方をマスターする！</font>

2020年も変わらずEtherCATで頑張りたいと思いました！！

それでは、よい年末を。よい年を！
北神（@nonnoise)

# 追記　2019年お世話になった方

★モウフカブール様
[![モウフロゴ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/021ec514-6193-55df-8729-b6983cbede82.png)](http://mofukabur.com/)

EtherCATの自作モジュールを作成する際に、最初のキックを送っていただけました！
ありがとうございます！2020年もなんとかやっていける気がしてます！

★K4ZUKI/KY技研　様 @_K4ZUKI_
<img width="595" alt="スクリーンショット 2019-12-25 17.09.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/f0b803cb-2dd8-5701-e675-710ffdf6e657.png">

いろいろ機材を貸していただきありがとうございます！Jetson nanoを借りたままなので、2020年持ち越しですが使える様、記事を書く予定です！！アレやコレがやりたいんじゃぁ！！！

★その他、ここまで見てくれました皆様！

ありがとうございます！なんとか2019年 EtherCATを個人利用や研究開発利用に向けて動き出せた様にも思えます。もちろん仕事で使うと言う話もあって良いです。ただ、**仕事で使っている道具って萌えない？**って感情がどうしても付き纏いますので、
**自宅に産業用通信規格があるって萌えない？**
を2020年も大切にしていきたいと思います！！

ありがとうございました！！！　2019年12月25日
Ubuntu16.04+RでKerasのインストール

#はじめに
ぐぐったらそこそこ記事出てくるのに引っかかってしまったので書きました。

#環境
- Ubuntu16.04
- R version 3.6.2 

#問題
[ここ](https://keras.rstudio.com/)にKerasのインストール方法が書いてあるのにRのコンソールに
`devtools::install_github("rstudio/keras")
library(keras)
install_keras()`
を打ってもうまくいかない。

#原因と解決法
こういう時に冷静にエラーメッセージ見るのってすごく大事ですよね（自戒の意味を込めて）
エラーメッセージは以下のようになってました。

`’devtools’ という名前のパッケージはありません`

devtoolsが入っていないだけのようです（恥ずかしすぎる）
というわけで、以下のコマンドでdevtoolsをインストールして解決しました。

`install.packages("devtools")`

もう一度
`devtools::install_github("rstudio/keras")
library(keras)
install_keras()`
を打ち込むときっちり動くと思います。

今度は、チュートリアルでもやってみたいと思います。

どうでもいいですけど、install_keras()打ったらMiniConda入れろって言われるのなんか理不尽感じませんでした？笑
PythonじゃなくてRでやってる意味…
Power BIで日付テーブルを作る

## 1. テーブルを作る
左タブ [データ] > 上部タブ [モデリング] > [新しいテーブル] > テキストボックスに下記のDAX関数をコピペ

```
Calendar = 
ADDCOLUMNS (
CALENDAR (DATE(2000,1,1), DATE(2025,12,31)),
"DateAsInteger", FORMAT ( [Date], "YYYYMMDD" ),
"Year", YEAR ( [Date] ),
"Monthnumber", FORMAT ( [Date], "MM" ),
"YearMonthnumber", FORMAT ( [Date], "YYYY/MM" ),
"YearMonthShort", FORMAT ( [Date], "YYYY/mmm" ),
"MonthNameShort", FORMAT ( [Date], "mmm" ),
"MonthNameLong", FORMAT ( [Date], "mmmm" ),
"DayOfWeekNumber", WEEKDAY ( [Date] ),
"DayOfWeek", FORMAT ( [Date], "dddd" ),
"DayOfWeekShort", FORMAT ( [Date], "ddd" ),
"Quarter", "Q" & FORMAT ( [Date], "Q" ),
"YearQuarter", FORMAT ( [Date], "YYYY" ) & "/Q" & FORMAT ( [Date], "Q" )
)
```

## 2. 日付テーブルとしてマークする
[日付テーブルとしてマークする] > [Date]を選択

## 3. Calendarテーブルと紐づけたいテーブルにリレーション設定用の列を作成する

Date列同士だと、時刻まで加味されてしまう。今回は日単位でリレーションを設定したいので、リレーション設定用のカラムを作る。今回はDateAsIntegerを使う。

左タブ [データ] > 上部タブ[モデリング] > [新しい列] > 下記DAX関数を追加

```
DateAsInteger = FORMAT ( [Date列], "YYYYMMDD" )
```

## 3. リレーションを設定する
左タブ [モデル] > 接続したいテーブルに[DateAsInteger]フィールドをドラッグアンドドロップ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268023/28ae0fc3-39f5-4160-896d-acbde3eb97de.png)

## 参考
[How to create a date table in Power BI in 2 simple steps - Kohera](https://kohera.be/blog/power-bi/how-to-create-a-date-table-in-power-bi-in-2-simple-steps/)
[Lesson 4: Create Relationships | Microsoft Docs](https://docs.microsoft.com/en-us/analysis-services/tutorial-tabular-1200/lesson-4-create-relationships)
[Re: Date Table Data Mixup - Microsoft Power BI Community](https://community.powerbi.com/t5/Desktop/Date-Table-Data-Mixup/m-p/177307#M77527)
Rust + Entity Component System で仕様変更に強いゲーム設計 その１ 〜 序文


## はじめに

面白いゲームを作りたい！と思ったら、試行錯誤をどうしても必要。
作ってみたけど、イマイチだったから、こう変えたい、なんて事は日常茶飯事です。

プログラマーは、降りてきた仕様をそのまま実装するのでなく、将来の仕様変更を見越しつつ、現実的な工数で、柔軟でメンテナンス性の高い、ソフトウェア設計をしなければなりません。

今まで私が経験してきた多くのプロジェクトは、オブジェクト指向による設計をしていました。

しかし、開発が進み、仕様変更を繰り返すうちに、いつしかスパゲッティコードになり、どのデータがどのデータに依存して変更されるのか、分からなくなっていく…

そのパターンがいつも繰り返されています。（読者の中にも、そんな方、いらっしゃるのではないでしょうか？）

## Rust

今までC++やC#でのゲーム開発をしてきましたが、そもそもの言語設計が、オブジェクト指向をベースとしています。よってどうしても、考え方がオブジェクト指向から離れず、上に書いた様な問題に直面することは、避けられないように思います。

Rustは、関数型の考え方を取り入れた言語であり、強力なミュータビリティ（変数の変更可能・不可能）チェック機能により、プログラマーはデータの変更について、強制的に意識させられます。
（Rustの初学者は、このことが煩わしくて、返って毛嫌いしてしまう事も多いのですが、実はこれこそが、堅牢でバグの少ないコードを書くことに、大変有用なのです）

Rustでオブジェクト指向的な考え方で実装しようと思うと、ミュータビリティチェックにひっかかり、どうしてもうまく行かないことに気付かされます。

例えば、プレイヤーキャラを表すクラスを作ったとして、その中に、HPや攻撃力、バフ・デバフ、位置や、グラフィックの制御など、あらゆるデータを詰め込んでしまうと、ある機能はHPや攻撃力だけにフォーカスした処理なのに、クラスに他の情報が一緒になっているために、「あるオブジェクトを変更している間は、そのオブジェクトを他から参照してはならない」というRustのルールによって、コンパイルエラーになってしまう・・・といったことが起こります。

Rustでは、「モノ＝オブジェクト」をベースとした設計では、うまく行きません。そうではなく「機能」をベースとして、それに必要なデータとは？と考えて、小さな機能を組み合わせることで、全体の仕組みを作っていく、という設計が求められます。

## ECS
そこで、ECS(Entity-Component System) です。

ECSによる設計では、ある機能を実現するのに必要なデータを「コンポーネント」に分け、そのコンポーネントに「システム」側からアクセスし、データに変更を加えることで、機能を実現します。

例えば、「速度」コンポーネントと、「位置」コンポーネントがあったら、「移動」システムは、「速度」コンポーネントからデータを読み取り、「位置」コンポーネントのデータに読み取った速度を加算します。
これによって、移動の機能が実現するわけです。


ECSについて詳しくは、
https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%83%86%E3%82%A3%E3%83%BB%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%83%BB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0
こちらなどを参考にしてください。

## これからやりたいこと

ということで、今後何回かの投稿に分けて、Rust + ECS を用いて、ゲーム設計をするとどうなるのか、やってみたいと思います。

私もやりながら、勉強しながらなので、途中で、やっぱこうした方が良かった、なんてこともあるかと思いますが、お付き合いいただけると幸いです。



## 目次

[その１ 〜 序文](https://qiita.com/mas-yo/items/e7d1e247e5d4a9f47e92)
[その２ 〜 キャラの移動](https://qiita.com/mas-yo/items/207244f04dd442cb567c)
[その３−１ 〜 コンポーネントの設計](https://qiita.com/mas-yo/items/e1f89bea5f84b7041462)
[その３−２ 〜 システムの設計](https://qiita.com/mas-yo/items/ca97fe6ed961d77be715)
[その３−３ 〜 メイン部分](https://qiita.com/mas-yo/items/9f0459dd942a874c6273)
[その４−１ 〜 剣を表示](https://qiita.com/mas-yo/items/daae411935d138d85c95)
[その４−２ 〜 アニメーションコンポーネント](https://qiita.com/mas-yo/items/678d775e4caf5e14abe7)
[その４－３ 〜 アニメーションを動かす](https://qiita.com/mas-yo/items/3db0a920cb76c75bca51)
[その５－１～ あたり判定](https://qiita.com/mas-yo/items/598ed52f5c08a0375ead)
[その５－２～ やられアニメーション](https://qiita.com/mas-yo/items/cf017ac1ebdd7ce25d86)
[その６ 〜 これまでの振り返り](https://qiita.com/mas-yo/items/22ead1dc226da4df54e2)


(2020.3.9 目次を追記しました)
Xcode11のAutoLayoutにつまづいた

# メリークリスマス！
みなさま昨日の夜はどう過ごされましたか？ ~~私は学校でした~~
こちらはiOS13、Xcode11 私はこうしてつまずいた Advent Calendar 2019　25日目の記事です．
大トリとしては拙すぎる記事ですがよろしくお願いいたします．
# 何が起こったのか
[それはUIScrollViewでページングできる機能](https://qiita.com/tessy0901/items/9763ea817ea62e6fe2b4)を実装していたときに起こりました・・・
Xcode11からUIScrollViewのAutoLayoutの方法が変わったのはみなさまご存知だと思うのですが，私はその変更に四苦八苦していました．
すでにこの時点でつまづいています．
そしてようやくできた（と思われた）のでビルドしてみると・・・
![Unknown1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230705/5f0ca03c-a382-73ce-3326-fea34e2aa7b7.gif)
なんかずれてる・・・
このときそれぞれのViewの幅は画面幅と同じにしているため，理論上ずれることはないはずでした．
# 原因と解決
##原因
理由としてはView同士を隙間0でくっつけていたはずなのに，謎の`Constant=standard`が入っていたことでした．~~まるで百合カップルの間に入ってくる男キャラみたいですね~~
<img width="258" alt="スクリーンショット 2019-12-25 9.22.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230705/ef8555e3-6f36-2a35-27fa-772b0577ec1c.png">
<img width="259" alt="スクリーンショット 2019-12-25 9.22.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230705/b2d0d1c9-dd8f-1065-3aa1-58849590834d.png">
どうもXcode11からは`Add New Constantraints`の初期値がStandardに変更されたようで，さらにバグなのかはわかりませんが0を入力したはずなのに勝手にstandard Valueが代入されていたようです．
<img width="266" alt="スクリーンショット 2019-12-25 9.27.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230705/afcbf39d-ccb0-759d-1181-6ba40fd7778c.png">
## 解決方法
おそらくすでに解決方法が思いついている方もいるかと思いますが，~~私の手柄にするために~~説明させていただきます．
御造像の通り，`standard -> 0`にするだけですね．
![Unknown2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230705/4856eddd-1340-3a1a-0297-c9399367154a.gif)
直りました！
# 最後に
謎の隙間が発生した時の参考になればと思います．
intra-martの環境作成について

本記事では、intra-mart Accel PlatForm(以下、intra-mart)の環境構築に必要なモジュールのうち、必須なものについて概要をまとめます。

詳細は下記に公式ガイドが掲載されていますので参照願います。
https://www.intra-mart.jp/document/library/iap/public/setup/iap_setup_guide/index.html

主に次の方向けの内容となっています。
・intra-martの環境構築に初めて着手される方
・環境構築の経験があるものの、ブランクがあり久々に着手される方
・自身向けの備忘録

それでは、公式ガイドの順に記載します。


###ミドルウェアの設定
各種ミドルウェアを入手します。

１．JDK
JDKのセットアップを行います。
Oracle社の公式サイトからインストールして下さい。

２．データベース
Oracle、Microsoft SQLServer、PostgreSQL等が使用可能。
導入先からの指定がなければ、使い慣れたものを使用して下さい。

３．JDBCドライバ
使用するデータベースに合わせて入手して下さい。

４．Application Server
resinサーバーを使用します。
intra-mart社の公式ダウンロードページから入手して下さい。

５．Web Server
Apache、IIS等が使用可能。
UNIXやLINUX系であればApache、Windows系であればIISが使われるのが一般的です。

６．Apache Cassandra
任意のため省略。

７．Apache Solr
任意のため省略。


###WARファイルの作成
IM-Juggling(以下、Juggling)ツールを使用し、デプロイ（環境作成）作業に必要なWARファイルを作成します。
Jugglingツールについての詳しい内容については、後日改めて記載します。

８．モジュール選択
intra-martには「IM-WorkFlow」をはじめとする様々なコンテンツがありますが、導入先の要件に合わせて必要なアプリケーションを選択することで、intra-martの各種パッケージ製品を使用することが可能になります。
アプリケーション選択の詳しい内容については、後日改めて記載します。

９．設定ファイル
intra-martの初期起動時に読み込まれる各種設定ファイルを、Jugglingツール上で編集します。
DBサーバーの接続先や、storageフォルダの接続先、ログファイルの出力先等々の設定を行います。

１０．WARファイル出力
選択したモジュール及び設定ファイルを基に、デプロイ用のWARファイルを作成します。


###テナントの構築
各種起動を行った後、デプロイを行います。
デプロイ後はテナント環境をシステム管理者の画面から順次セットアップし、ライセンスキーを登録すれば完了となります。

１１．起動
以下の順に起動します。
① Web Server
② Application Server

１２．デプロイ
９の手順で作成したWARファイルを指定し、コマンドプロンプト上からデプロイコマンドを実行します。
デプロイ実施後はintra-martの起動が自動的に行われます。

１３．テナント構築
２種類のログイン画面のうち、システム管理者のログイン画面にアクセスします。
テナント構築が未完了の場合、構築用の専用画面が表示されるので、画面のナビに沿って設定して下さい。

１４．ライセンス登録
使用するアプリケーションについて、各種ライセンスキーの登録を行います。
テナント構築後システム管理者でログインし、システム管理者画面内のメニューからアクセスします。

手順が多く最初は手間取ってしまうと思われますが、数回こなせば意外と慣れてしまう内容です。
次回以降、より詳細な内容を記載していきます。
アウトプットし始めて気づいたこと3つ

# アウトプットをし始めて気づいたこと

## はじめに

よくネットなどで**「エンジニアはアウトプットは大事だ」**という言葉をよく聞きますが、
今までアウトプットをあまりせずに来た新卒エンジニアである私が会社(dip)のアドベントカレンダーに参加して
10日に1本ペースで書いてきて気づいたことをつらつらと書いてみたいと思います。

## 誰のために書いた記事か

**「エンジニアはアウトプットが大事」**とは言われつつも一歩を踏み出せないエンジニア志望者/エンジニア一年生

## その1：アウトプットはしんどい

ある程度まとまった記事を書こうと思うと現状では**1本/10日でもしんどかった**です。
何がしんどかったのか？

- そもそも書くことが思い浮かばない
- まとまった分量の日本語を書くことが難しい

といったところでしょうか？

### そもそも書くことが思い浮かばない

アドベントカレンダー書きます！と言ったものの何を書けばいいのかわかりませんでした(今もわかってない）
だからこそ普段の業務や個人開発で詰まっても全然解決法が検索しても出てこなかった時は**チャンス**とさえ最近は思っています。
解決すれば嬉しいし、記事にもできて一石二鳥です。
また、間違った内容を出したくないという気持ちから、もともとの知識や新たな知見を一度精査するという工程を踏むので、
単なる経験・体験から一段階上の知識・記録へと昇華できるというメリットもあります。

### まとまった分量の日本語を書くことが難しい

いつも自分が書く日本語の量といえば140文字以下が基本になってしまっているので、
最初から最後まで論理の破綻していない文章を書くことが難しくなってしまっていました。
ただ、それも書いていくうちにトレーニングできているという実感が持てています。

## その2：ウケるだろ！と思ったものが全然ウケない

これ頑張ったから評価されるかな？と思った記事が全く評価されず、
逆に後から見たら稚拙すぎて消したい記事がじわじわと伸びています。
バズっている記事を観察してみると

1. 旬の言語・話題の技術についての記事
2. 本人しか知り得ない面白い体験談

が多いことに気づきます。
2.ももちろん話術として重要ですが、やはり1.の `旬` についてはアウトプットをし始めてから気づいたことでした。

## その3：わずかな反響が嬉しい

はじめて「いいね」や「ストック」してもらえてQiita右上のカウンターが赤くなった時はやはり嬉しかったです。
記事を書いたら社内やグループ内に一方流す、それだけでも見てくれる人は0人じゃない(はず)で、
リアクションももらえる(はず)ですので、恥ずかしがらずに「こんなん書いたで！」って出していくのがよいと思いました。
(間違ってる部分があれば指摘ももらえますしね)

## まとめ

長々と書いてきましたが、まとめると以下になります。
よかったら今までアウトプットしてこなかった勢もはじめましょう！

#### デメリット

- しんどい

#### メリット

- 知識の純化
- 論理・言葉の練習
- アンテナを張るようになる
- リアクションもらえたら嬉しい
記事に「user:user tag:記事のタグ」への検索リンクを追加するユーザースクリプト

![item.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62354/1aa95596-589f-5a77-adc1-b6532de6d307.jpeg)

![search.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62354/836856f3-7cab-973e-e3ef-00c91722e916.jpeg)


気になる記事を書いた人の他の記事を調べやすくする活動その2。
前回は[Qiitaのユーザー画面からそのユーザー記事のフリーワード検索へ移動する](https://qiita.com/khsk/items/4a6ffc6fc1b98d058da4)でユーザーページに追加しましたが、

ユースーケースとして考えなおしてみると、

ある記事Aを見てユーザーBのほかの投稿に興味が出たとき、読者が求めるのはAと共通項を持つ記事
「user:B tag:(Aに設定されているタグ)」
なのではないかと思いました。

「user:B」(+ フリーワード検索)でもまあまあ見たいものは探せるのですが、
結局手入力が面倒なのとフリーワードで絞るよりタグで絞ったほうが投稿記事の一覧性、ザッピング性能は上なんじゃないかなと使っていて思ったので、表題にあるようにスタートを記事にしてみました。

前回の

>動機
>
良い記事を見つけて、そのユーザーのその分野の記事をもっと見たい！と思ってユーザーの記事画面 https://qiita.com/Qiita/items (itemsはもうないのですが)　に飛ぶものの、時系列で並ぶだけで投稿数とジャンルが多彩な方の場合は目的の記事を探すことが難しいです。
>
最初からフリーワード検索をすればいいのですが、
どうしてもそのユーザーの記事を探したいときの行動がユーザーページ訪問、と身についてしまっていることと、
ユニークなユーザー名の入力が苦手なので入力補助的な意味合いで作成。

の

>そのユーザーのその分野の記事をもっと見たい！

ならやっぱりtagで絞ったほうがいいのかなと。

# コード

```js
// ==UserScript==
// @name         Qiita add links to search for user and tag
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  投稿者かつ記事のいちタグの検索リンクを追加する
// @author       khsk
// @match        https://qiita.com/*/items/*
// @grant        none
// ==/UserScript==

(function() {
  'use strict';
  const tagClass = 'it-Tags_item'

  // 表示名の変更は反映されてないはず
  const id = document.querySelector('.it-Header_authorName').textContent.slice(1)

  const icon = document.querySelector('.it-Header_authorImage').cloneNode()
  icon.style.height = '16px'
  icon.style.width = '16px'
  const link = document.createElement('a')
  link.className = tagClass
  link.style.paddingLeft = 0
  link.style.paddingRight = 0
  link.appendChild(icon)

  document.querySelectorAll('.' + tagClass).forEach(tag => {
    tag.style.marginRight = 0
    link.href = 'https://qiita.com/search?q=user%3A' + id + '%20tag%3A' + tag.textContent + '%20'
    tag.parentNode.insertBefore(link.cloneNode(true), tag.nextSibling)
  })

})();
```

リンクの設置場所はタグの隣にユーザーアイコン画像で設置しました。
なんだか懐かしい気分に。昔はタグ名の左にアイコンだった…かな？

radiusがちょっと気持ち悪いけど許容しておきます。
Daplink 新マイコン対応方法

#Daplinkとは何？
ARM マイコンのデバッガには CMSIS-DAP方式が一般的なのですが、
HID(CMSIS-DAPデバッグ）にMSC(ストレージプログラミング) CDC(コムポート）とWEBUSBが追加された物と考えれば良いらしい。

#デバッガの作り方
バイナリーは、https://github.com/ARMmbed/DAPLink/releases/tag/v0254
のしたの方の、0254_release_package_f499eb6e.zipを取得解凍後、
自分の使用するマイコンの中身を書換える

stm32-nucleoをデバッガとして使用する場合
https://qiita.com/toyowata/items/a57ee1dfa884b29c298d
秋月LPC11U35をデバッガとして使用する場合。
https://qiita.com/toyowata/items/a57ee1dfa884b29c298d

ここまでが一般的使用方法のまとめ、

#新マイコン対応方法
ここに要約してある。実際はやっていないのでまとめのみ
https://os.mbed.com/docs/mbed-os/v5.15/porting/adding-a-new-target.html
1.c.d.の自分のターゲットマイコンのデバイス記載を作成
そして、c_blob.c in flash_blob.c, and c_blob_mbed.c in Flash APiを作成するのだと思う。

2.次に
https://gist.github.com/toyowata/6c3798893319b38c1b9f5925daaa9255
をみて、
先ほどa.b.を行う。

以上
[WordPress]特定のフィールド項目を記入している最新記事を表示させる方法

急遽WordPressを触らないといけない事になりキャッチアップのフローを、ノート代わりにまとめていきます。
主に自分の学習の流れを振り返りで残す形なので色々、省いてます。
Webエンジニアの諸先輩方からアドバイスやご指摘を頂けたらありがたいです！

#特定のフィールド項目が記入されている記事を表示させたい！
最新記事を表示させる方法は調べたら直ぐに見つかりました。
・[特定の記事だけ最新の５つ取得したい](https://gist.github.com/furahaclothing/3712942/)
・[最新記事５件を出力する方法](https://denno-sekai.com/wordpress_latest_articles/)

ただ、特定のフィールをを記入されている記事に絞り込むのにちょっと時間がかかりました。


このコードで表示できた！

```php

        <?php 
            $args = array(
            'post_type' => 'posts',
            'posts_per_page' => 6,
            'meta_key' => 'title',
            'meta_value' => ' ',
            'meta_compare'=> '!='
              );
              $my_query = new WP_Query( $args );
        if ($my_query->have_posts()) :
            while ($my_query->have_posts()) : $my_query->the_post();
        ?>
        <article>
            <a href="<?php the_permalink(); ?>">
              <div>
                <p><?php the_field('title'); ?></p>
              </div>
            </a>
        </article>
 
      <?php endwhile; ?>
      <?php endif; ?>
      <?php wp_reset_postdata(); ?>
```

軽く説明

①ここでは表示させたい投稿記事を絞り込んでいます。
まず、投稿タイプ「posts」を指定
「posts_per_page」で何件表示させるか指定
「meta_key」ではフィールド名を指定
「meta_value」では値が空の場合「meta_compare」で表示させない。

つまり、titleの値を記述されている記事のみを絞り込んでいます。
今回は、ややこしい記述になりましたがもっと良い記述があれば教えて頂ければ幸いです。

```php

$args = array(
            'post_type' => 'posts',
            'posts_per_page' => 6,
            'meta_key' => 'title',
            'meta_value' => ' ',
            'meta_compare'=> '!='
              );
              $my_query = new WP_Query( $args );
```

②あとはいつも通り記事を表示するループ文を記述

```php

if ($my_query->have_posts()) :
            while ($my_query->have_posts()) : $my_query->the_post();
        ?>
        <article>
            <a href="<?php the_permalink(); ?>">
              <div>
                <p><?php the_field('title'); ?></p>
              </div>
            </a>
        </article>
 
      <?php endwhile; ?>
      <?php endif; ?>
```



##参考にした記事

[wp_reset_postdata(); は、どこに書けばいいですか？](https://teratail.com/questions/189166/)
[wordpress 記事一覧で特定の記事を除外する](https://qiita.com/triamquium/items/91ea57ad0ad30a356b03/)
[カスタム投稿タイプの新着記事を表示する](https://site-manage.net/archives/2558/)
[カスタムフィールドの有無を判定して処理を分岐する -『wordpress』](https://webmanab-html.com/tip/wordpress-custum-field-if//)
論理型脳で型推論を実装してみた(みんな嫌いな?磯野家の家系図の話は部分型システムの理解に有用だった話

このエントリは型 Advent Calendar 2019 - Qiita 3日目に遡って投稿しているエントリです。 担当に遅刻した訳ではなくて空いてたので前から詰めて投稿しただけです。

h_sakuraiです。世の中に型推論アルゴリズムは色々知られていると思いますが、Prologを使えば単一化とバックトラックがあるので型推論を素直に書けるよというネタ記事です。

## swiprolog のインストール

    $ apt install swi-prolog
    $ brew install swi-prolog

等で、インストールできます。

## ハローワールド

```hello.pl
:- write(hello),write(' '),write(world),nl.
:- writeln(飛べない + 豚 = ただの豚).
:- H='hello world',format('~w\n',[H]).
:- halt.
```

SWI-PrologはLispのシンボル的なAtomを文字列代わりによく使います。短くて済むので便利です。
writelnを使うと改行が使えます。
:- から始まる行はプログラム読み込み中に実行されます。

実行方法:

```
$ swipl hello.pl
hello world
飛べない+豚=ただの豚
hello world
```

OK 表示できました。
述語内の式はただの式だ。`飛べない + 豚 = ただの豚` はただの式だ。

## 型推論

```Prolog:t.pl
t(I,int):- integer(I). % T-Int
t(E1+E2,int):- t(E1,int),t(E2,int). % T-Add
t(E1-E2,int):- t(E1,int),t(E2,int). % T-Sub
t(E1*E2,int):- t(E1,int),t(E2,int). % T-Mul
t(E1/E2,int):- t(E1,int),t(E2,int). % T-Div
:- t(1+2*3+4/5,int).
:- t(1+2*3+4/5,T),writeln(T).
:- t(hoge,int).
:- halt.
```

実行方法

```
$ swipl t.pl
int
Warning: /tmp/t.pl:8:
        Goal (directive) failed: user:t(hoge,int)
```

推論結果intが表示されました。
t(hoge,int) は失敗するので警告が表示されます。
% 以降はコメントです。

## ユニットテストとか

現代的 Prolog にはユニットテストがついておりますので使ってみましょう:

```Prolog:t2.pl
t(I,int):- integer(I).
t(E1+E2,int):- t(E1,int),t(E2,int).
t(E1-E2,int):- t(E1,int),t(E2,int).
t(E1*E2,int):- t(E1,int),t(E2,int).
t(E1/E2,int):- t(E1,int),t(E2,int).
:- begin_tests(t2).
test(int):- t(1,int).
test(e):- not(t(hoge,int)).
test(e):- t(1+2*3+4/5,int).
:- end_tests(t2).
:- run_tests.
:- halt.
```

実行方法:

```
$ swipl t2.pl 
% PL-Unit: t2 ... done
% All 3 tests passed
```

テストしたので実行感があります。

## Norminalな部分型システム

みんな嫌いな?磯野家の家系図の話は部分型システムの理解に有用だった話

```Prolog:sub.pl
sub(_<namihe). % Namihe
sub(T<T).      % Jibun
sub(T1<T3):- sub(T1<T2),sub(T2<T3). % Trans
sub(T1<T2):- class(T1<T2).          % Class

class(sazae<namihe).
class(tarao<sazae).
:- sub(tarao<namihe>).
:- halt.
```

これ実行すると死ぬので、ctrl+c からの e します。

```
$ swipl sub.pl
^C^C^C^C
WARNING: By typing Control-C twice, you have forced an asynchronous
WARNING: interrupt.  Your only SAFE operations are: c(ontinue), p(id),
WARNING: s(stack) and e(xit).  Notably a(abort) often works, but
WARNING: leaves the system in an UNSTABLE state

Action (h for help) ? exit
$
```

Prolog は完全性を捨て、チューリング完全となったのだ。

左再帰がいけないのだ。消すが良い。

```Prolog:sub2.pl
sub(_<namihe). % Namihe
sub(T<T).      % Jibun
sub(T1<T3):- class(T1<T2),sub(T2<T3). % Class-Trans

class(sazae<namihe).
class(tarao<sazae).
:- sub(tarao<namihe).
:- halt.
```

```
$ swipl sub2.pl
```

そうか、カツオ。何の音沙汰もないということは元気な証拠だ。

わかったぞ！ナカジマ。推移則があったら、左再帰の箇所を具体的な定義に変えればいいんだね。

## まとめ

Prolog 使うと推論規則を簡単に実装できて楽だよ。
K-SECセキュリティウィンタースクール2019に参加してきました

___※今回結構公開不可な内容が多いので記事が浅いです___

## K-SECセキュリティウィンタースクールに参加してきました
- K-SECってなんぞや？
    - 意外と知られていないような気がするので紹介すると
    - KOSEN Security Education Communityの略で簡単にいうと高専の情報セキュリティ人材育成事業です
    - 情報セキュリティといいつつ、今回は機械制御セキュリティ的なコースもありました
    - 拠点校が4つあり、そのうちの１つの石川高専に行ってきました
    - [公式サイト](https://csinfo2018.kochi-ct.ac.jp/)

## なにやったの
- AppGoat
- ログ解析演習
- SIEM演習
- Malware Containment

## AppGoatを用いたセキュリティインシデントの学習
- [これ](https://www.ipa.go.jp/security/vuln/appgoat/)やりました
- やったことある方ならわかると思うのですが、私はレベル2をちょっと苦労しながら解くという感じでした
- クロスサイトリクエストフォージェリ(CSRF)とかは知らなかったのでレベル1で結構悩みました
 
## ログ解析演習
- これはうちの某授業とネタ被りだったので経験済みでした（）
- apacheのアクセスログをLinuxのコマンドを駆使して分析するというやつです
- (今回はユーザーエージェントを弾きました)
- robots.txtでクローラに与える情報を制限するとかは初めて知りました

## SIEM演習
- これが一番難しかった...
- とあるシナリオが与えられ、それを解析していくという演習でした
- あまり詳しくは言えないのですが、ポイントは
    - 潜伏後の横展開
    - 永続性
    - 時系列順にログ解析していく
    - 正常な通信とはということを理解していないと判別が難しい
    - etc...
- などのポイントを考慮しながら解析を進めていきました
- 短い時間の中で原因を探れたチームもいたのですごいなと思いました
- 自分たちもあと２つ暗い解析すれば辿り着けそうなところまで行きました

## Malwre Containment
- JNSAさんが作ってくれている[これ](https://www.jnsa.org/edu/secgame/malcon/malcon.html)です
- 役割を読んでいただくとわかると思うのですが、私はコマンダー(司令塔みたいな役割)をし、なんとかオールクリア(不正な通信を全て封じ込める)ところまで行きました
- コマンダーはできることが多いので、優先順位をつけるのが大変でした
- インシデント発生から、初動くらいまでの動きを学ぶことができます
- 技術的な部分は問われず、流れを知ることができるので、初心者にはとてもいい教材だと思いました

# 感想
- やっぱりセキュリティの分野は特に「知識＋経験」をなるべく一緒に積んでいかないといけないと感じました
- SIEM演習をしていても、「これしたいんだけどどうしよう」とか、「この情報あるけどなにを示しているのか」とかがあり、知識不足で困ったり、経験不足で困ったりしていました
- 特に実践的な部分を学ぶのが難しいので、このような勉強会や、前回参加した[Micro hardening](https://www.gsx.co.jp/academy/microhardening.html)はとてもいい経験になったなと感じました
- セキュリティ専門家になろうとは今の所思っていませんが、サービスを作る上でセキュリティの知識は求められるので継続して学習していこうと思っています
- 金沢は観光地がいっぱいあって楽しかったです
![20191223_092919.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351683/c9f33e28-3d44-0f29-7614-6b78d9c67f84.jpeg)
![20191223_095005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351683/e5725683-e860-8d60-d746-a3c9a49ebf41.jpeg)
PWA-Studio(Magento2)で遊んでみた。(2019/12)

本記事は、[Magento Advent Calendar](https://adventar.org/calendars/4213) 22日目の記事です。

本記事では、現在開発が進んでいるMagento謹製のPWA環境、[PWA-Studio](https://magento.github.io/pwa-studio/)を触ってみた感触を伝えていきたいと思います。

既存のテーマ(Lumaなど)にPWAの仕組みを組み込もうとしたPWA-Studio1.0時代から数年が立ち、

フロントエンドを０から新規実装する方向に切り替えた、現在のPWA-Studio2.0を使用いたしました。（@magento/pwa-studio:4.0）

## 1.PWA-Stugioの仕組み

Magentoインスタンスから完全に切り離されたPWA-Studioは、下記の2点で構成されています。

1. Reactをベースとしたフロントエンド
1. NodeJSをベースとした中間サーバー（UPWARD）

![upward-server-diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97920/79878614-b441-8f89-2816-ffc48dd435d1.png)

PWA-Studio自体が完全な静的ファイルとなっていないのが少し残念なところではありますが、

フロントエンド側は、Magentoインスタンスへの接続方法を意識することなく、UPWARDサーバーへのhttpリクエストのみを意識すれば良いという二段構えの構成になっているようです。

## 2.開発環境

PWA-Studio開発環境の構築方法は主に2つの方法が用意されていました。

1. package.jsonを元にコマンドを叩いていく方法 (UPWARDの起動・Webpackのビルドなどなど)
1. 開発環境用に提供されているdocker-composeを利用する方法

[公式のチュートリアル](https://magento.github.io/pwa-studio/venia-pwa-concept/setup/)では、1の方法が紹介されていますが、2.の場合はコマンド一つで即座に開発環境を立ち上げることが出来るため、おすすめです。（なぜかDevdocsに記載されていない。）

pwa-studioのルートディレクトで下記コマンドを実行するだけで、

```
./docker/run-docker
```

下記の処理を一度に行ってくれます。
・オレオレ証明書の作成
・UPWARDサーバーの立ち上げ
・ファイル群のビルド

デフォルト設定では、バックエンドにPWA-Studio開発用に公開されているMagentoインスタンスを使用するようになっています。

もちろん設定ファイルを書き換えることで自前のMagentoインスタンスに切り替えることも出来ます。（docker/.env.devを変更）

### 開発時の注意点

PWA-Studioでは、Magentoの基本とも言えるフォールバック機能がまだ搭載されておりません。

しかしながら、[FallBack Studio](https://github.com/Jordaneisenburger/fallback-studio)というPWA-Studioにフォールバックの仕組みを組み込もうというプロジェクトにスターが集まってきているようなので、こちらの開発状況も気になります。

また、Magentoの特徴とも言える多言語対応も現在のところは未定のようです。

公式では言及されていませんが、ソースコードのコメントアウトに「今は品質向上が最優先で、Translationは後回し」という記述がありました。

フロントエンドは自力で翻訳するにしても、バックエンドから返るエラーメッセージはどうやって翻訳することになるのだろう。　

## 3.本番環境

本番環境の運用には、本番環境用のDockerfileが用意されていました。(/Dockerfile.prod)

ビルド後の静的ファイルとUPWARDサーバーを一つのDockerイメージに突っ込む形となっているようです。

### 試しにHerokuにデプロイしてみました

親切にも本番環境用のDockerfileが提供されているため、PWA-Studioをコンテナ化してHerokuにデプロイしてみました。 
（いつのまにか、Herokuにコンテナホスティングが追加されていた。。）

Herokuのプロジェクト作成部分は、本記事では省略いたしますが、

コンテナホスティング用のプロジェクトを立ち上げたら、PWA-Studioのプロジェクトルートにheroku.ymlを追加して、後はgit pushするだけで、簡単デモ環境が構築できます。（Backendホストなどはdocker/.env.prodで指定）

```
$touch heroku.yml
build:
  docker:
    web: Dockerfile.prod
run:
  web: yarn stage:venia
```

今回作成したものは、下記よりアクセス出来ます。

https://pwa-studio.herokuapp.com/ 
(ベースカラー変更 + 一部日本語対応)

初回アクセス時は、ビルド後の巨大jsファイルのダウンロードに加えて、Herokuが寝ていることもあり、少々暇がかかりますが、

一旦アクセスしてしまえば、ServiceWorkerのキャッシュがバキバキ効いてきて、月末の通信制限状態でもグリグリ動作するようになります。



## 4.課題

実際に触ってみると、いくつかPWA-Studioの課題が見つかりました。

・マイページが注文履歴しか用意されていない (注文履歴もおそらく機能していない)
・翻訳機能が未対応
・絞り込み検索の動作が怪しい
・決済方法の実装が必要(Braintreeが標準で用意されているものの、日本では使えないため、独自実装が必要)

主に英語圏では、すでに実用段階との話も出ているようですが、その他の国では自力で頑張らなくていけない部分がまだまだ多い印象を受けました。

現在のPWA-Studioの最新版が4.0.0（5.0.0-alpha）、一部の開発者の中には V10かそれ以上にならないと使い物にならないとおっしゃる方も。。:worried:

いつかProductionとして利用出来る機会を楽しみに、今後も開発状況をウォッチしていきたいと思います。

https://github.com/magento/pwa-studio
jqコマンドでJSONからキー名をいい感じに取得する

下記記事を参考にほぼほぼやりたいことはできたのですが、ハマったのでメモ。

[jq] JSONデータの特定階層にあるキー名のユニーク値を取得 - Qiita
https://qiita.com/withelmo/items/b0e1ffba639dd3ae18c0


## JSONファイル

行ごとにキーが同じだったり、違ったり、数も違うちょっと困ったJSONファイルがあるときに使えます。

```json:hoge.json
{"hoge1": "hoge", "hoge2": 2, "hoge3": false}
{"hoge2": "hoge", "hoge3": 2, "hoge4": false, "hoge5": "FOO"}
{"hoge1": "hoge", "hoge2": 2, "hoge6": false}
```

## いい感じのコマンド

```console
> cat hoge.json | jq -s -r '[ .[] | keys ] | flatten | unique | .[]'

hoge1
hoge2
hoge3
hoge4
hoge5
hoge6
```

### `jq` の`-s` オプションで配列にする

ファイル中に`{...}{...}{...}` と`[]` 括りされず、`,` 区切りもないため、`jq` の`--slurp` (`-s` )オプションで配列に放り込みます。

jq Manual (development version)
https://stedolan.github.io/jq/manual/

>--slurp/-s:
>
>Instead of running the filter for each JSON object in the input, read the entire input stream into a large array and run the filter just once.

>(Google翻訳)入力内の各JSONオブジェクトに対してフィルターを実行する代わりに、入力ストリーム全体を大きな配列に読み取り、フィルターを1回だけ実行します。


```console
# -s オプションなし
> cat hoge.json | jq

{
  "hoge1": "hoge",
  "hoge2": 2,
  "hoge3": false
}
{
  "hoge2": "hoge",
  "hoge3": 2,
  "hoge4": false,
  "hoge5": "FOO"
}
{
  "hoge1": "hoge",
  "hoge2": 2,
  "hoge6": false
}


# -s オプションあり
> cat hoge.json | jq -s

[
  {
    "hoge1": "hoge",
    "hoge2": 2,
    "hoge3": false
  },
  {
    "hoge2": "hoge",
    "hoge3": 2,
    "hoge4": false,
    "hoge5": "FOO"
  },
  {
    "hoge1": "hoge",
    "hoge2": 2,
    "hoge6": false
  }
]
```

### キー名だけ出力する

あとは上記記事と同じく`[ .[] | keys ] | flatten | unique` でキー名を取得、平坦化して重複を取り除きます。
ちなみに平坦化しないとこんな感じになります。`unique` が効きません。

```console
> cat hoge.json  | jq -s -r '[ .[] | keys ] | unique'
[
  [
    "hoge1",
    "hoge2",
    "hoge3"
  ],
  [
    "hoge1",
    "hoge2",
    "hoge6"
  ],
  [
    "hoge2",
    "hoge3",
    "hoge4",
    "hoge5"
  ]
]
```

最後に`.[]` で出力し、`jq` コマンドの`--raw-output` (`-r` )オプションでダブルクォーテーションを取り除きます。

jq Manual (development version)
https://stedolan.github.io/jq/manual/

>--raw-output / -r:
>
>With this option, if the filter’s result is a string then it will be written directly to standard output rather than being formatted as a JSON string with quotes. This can be useful for making jq filters talk to non-JSON-based systems.

>(Google翻訳)このオプションを使用すると、フィルターの結果が文字列の場合、引用符付きのJSON文字列としてフォーマットされるのではなく、標準出力に直接書き込まれます。 これは、jqフィルターが非JSONベースのシステムと通信するのに役立ちます。

最後を`.[]` としないと以下のようになり、`-r` オプションは働きません。

```console
> cat hoge.json | jq -s -r '[ .[] | keys ] | flatten | unique'

[
  "hoge1",
  "hoge2",
  "hoge3",
  "hoge4",
  "hoge5",
  "hoge6"
]
```

`jq` コマンドは奥が深いなぁ。


## おまけ

Google翻訳さんによると`slurp` は`丸lurみ` だそうですw
ヌードルハラスメント的ななにかが働いているのでしょうか？？？

<img width="1330" alt="スクリーンショット 2019-11-27 16.32.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/4e69e374-1edd-75a9-76ba-3c7b73fb8300.png">


## 参考

[jq] JSONデータの特定階層にあるキー名のユニーク値を取得 - Qiita
https://qiita.com/withelmo/items/b0e1ffba639dd3ae18c0

jq Manual (development version)
https://stedolan.github.io/jq/manual/
ToDoコメントをぶっ壊す

#はじめに
この記事は、[Qiita芸人 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/qiita-geinin)の25日目の記事です。

#前提
#####ToDoコメントの定義→「暫定対応(後で修正する可能性があるコード)」

#過去自分が経験したプロジェクトでToDoコメントをつけたことで発生した問題
###①ToDoと書いてる割に4年5年そのコードが残ってる
これは、大規模システムにありがちなケースなのですがそういったシステムを開発してる現場は入れ替わりが激しいです。なので前任者がToDoと書いて後から直すってことにしていたとしてもその人がやめたらそのコメントは残り続けるわけです。大規模なシステムのコードとかは基本影響のある部分だけを修正するといった形が多いのでそこに影響がある修正が入らない限り一生残り続けることになります。
###②ToDoコメントをつけた理由をそもそも忘れる
時間が経つと人間はなぜそんなコードを書いたかを忘れます。
これは時間が経過すればするほどどんどんうろ覚えになっていきます。
結果、どういった可能性があってToDoにしたのかを覚えてる人がいなくなりそもそもToDoコメントをつけた理由を忘れるのです。
###③ToDoコメントをつける温度感が人によって異なる
例えば、期限の有り無しですね。
仮対応としていったん対応していつまでに対応しなければいけないといったものなのかそうでないのかでもToDoコメントをつける際の温度感は大きく異なってくると思います。
ここがはっきりしていないと本当は本対応実装後リリースしないといけなかったものが仮対応のままリリースしてしまってバグが発生するといったケースも過去自分の入っていたプロジェクトで経験しています。

#ToDoコメントをつける際、気をつけること・解決策
じゃあいざToDoコメントを使うときに何を気をつけるべきか個人的な対策を書こうと思ってます。
###①ToDoコメントの対応をチケット管理
期間を設けてそのToDoコメントの対応をチケットで管理するのが一番効果的な気がしますね。
チケット管理してるプロジェクトが前提ですが・・・
###②ToDoコメントのコメントに詳細を加える
暫定対応ということが分かるだけでなくなぜ暫定なのか逆に本対応ではどういう対応をするつもりかをコメントに載せておくと後で見た人もわかりやすいので。。。

まあ正直①がちゃんと徹底できていれば②の対策はやる必要ないかなぁと思ってます。

#終わりに
タイトルの通り、ぶっ壊すまでは行かないですが・・・
僕が言いたいことは、
「ToDoコメント、つけるならちゃんと管理をしましょう」ということです。
WEBエンジニアとして一人立ちした個人ロードマップ(実装編)

#はじめに
この記事は、[commew Advent Calendar 2019](https://qiita.com/advent-calendar/2019/commew)の25日目の記事です。

自分は組み込みをずっとやってて、1年前まではWEBの知識どころか経験もないエンジニアでした。
そんな自分が独学で勉強して現場でほぼ一人プロジェクトを経験して今、スタートアップでWEBエンジニアとして今一人で仕事を進めれるまでに至った学習ロードマップを紹介しようと思います。

#前提
・エンジニアとしての経験は3年(SEとしての経験)
・WEBの経験は無し
・一年前は、プログラミングはほぼコピペばかりであまり自信がなかった
・ほぼ独学(プログラミングスクールやメンターなどは未使用)
・あくまで自分が一年前から今までどんな感じで学習してきたかを振り返る形なので参考程度に見ていただければと・・・

#学習ロードマップ(実装編)
①〜④は独学
⑤〜⑦は業務
になります。

##①Railsチュートリアル(2019/01~2019/02)
一番最初にやったのはRailsチュートリアルでした。
まあ決めた理由はだいたい未経験の方と同じ理由で色々なサイトでオススメされていたので。。。
日本語ドキュメントが充実していてFWを使った開発をしたことがなかったので、一通り全部やりましたね。
ここでWEBの楽しさとGitの便利さとローカルでのRailsの環境構築の大変さを主に学びました。
#####使った技術：
Ruby, Ruby on Rails, MySQL, Git, GitHub, Heroku, Node.js(環境構築用)

##②個人用のポートフォリオサイトを作成(2019/03)
転職をしようと思った時に何か自分で作ってみようと思ってVue.jsとFirebaseで簡単なポートフォリオサイトを作りました。
その時に作り方をまとめたのはこちらになります。

[Vue.js + Firebaseで自己紹介用の静的サイトを作ってみた 第1弾 環境構築編](https://qiita.com/cube_3110/items/7cfa7ac5cc611f3e0e92)
[Vue.js + Firebaseで自己紹介用の静的サイトを作ってみた 第2弾 実装編(ルーティング)](https://qiita.com/cube_3110/items/bd6735449fbb663e8ade)
[Vue.js + Firebaseで自己紹介用の静的サイトを作ってみた 第3弾 実装編(ヘッダー、フッター、SNSリンク設置)](https://qiita.com/cube_3110/items/10a9061e18b52e4b0c3a)

#####使った技術：
JavaScript, Vue.js, Vue-CLI2, Git, GitHub, Firebase(Hostingのみ), Node.js(環境構築用)

##③RailsでECサイト構築(2019/04~2019/05)
これもたまたまSNSで見かけたものなんですが、とだこうきさんがRailsチュートリアル終了レベル向けの学習教材として以下を公開していて自分は開始当初から参加していたのですが要件を最初に出してそれについて自分で考えながら作っていって後ほど解答と解説を公開するといった課題解決型でやってました。
有料の教材でしたがnoteで単体では安かったので手が出しやすかったです。
これとRailsチュートリアルでMVCの考え方とかは結構理解できた気がしますね。。。
[Railsで簡易ECサイトを作ろうWriteSomeCode](https://note.com/cohki0305/m/m229cd99f80eb)

#####使った技術：
Ruby, Ruby on Rails, MySQL, Git, GitHub, Heroku, Node.js(環境構築用)

##④RailsでLINEBOT作成(2019/06)
これはハンズオン形式の勉強会をやろうと思ってそこで作るためのものとして作りました。
ここで初めて外部APIを使用しました。

この時用意した資料はこちらです。
[【初心者向け】AWS Cloud9 + Ruby on Rails + Heroku + LINE messaging API でLINE BOTを作ってみた](https://qiita.com/cube_3110/items/bb80f4df0bec9df7f2b4)

#####使った技術：
Ruby, Ruby on Rails, Git, GitHub, Heroku, LINE messaging API, [Open Weather Map API](https://openweathermap.org/api), AWS Cloud9, Node.js(環境構築用)

##⑤PHPでほぼ一人プロジェクト(2019/07~2019/09)
容器管理システムの要件定義、設計、実装、テストまでほぼほぼ一人でやってました。
一応全体のスケジュールを管理する人は別にいたけど実作業はほぼ自分一人でやってました。
ある意味誰も頼れる相手がいない環境だけど納期はあるので追い込まれるのもあって、ここでかなり実装のスキルはつきましたね。。。

#####使った技術：
PHP(v5.0系), PostgreSQL(バージョンは忘れました), RedHat3系, IE5系, jQuery, JavaScript, A5MySQL

##⑥診断サイトのJS部分の実装(2019/08)
こちらは副業でやってたものですが、デザインコーディングの終わってる診断サイトに動きをつける部分の実装のみを担当してやらせてもらいました。
VueのComponentを使って特定部分だけVue実装といった形で対応しました。
WordPress案件も初だったのでローカルでのMAMPを使ったWordPress環境の構築もこのタイミングで初めてやりましたね。
副業でのお客さんが優しかったのもあり、いい感じに終わらせて報酬を無事受け取ることができました。

#####使った技術：
Vue.js, WordPress, MySQL, PhpMyAdmin, MAMP

##⑦SymfonyでSaaSの開発(2019/10~現在)
今は、現職でECプラットフォームのアプリケーション開発を行ってます。

#####使った技術：
PHP(5.6系, 7.1系), Symfony(2系、3系), JavaScript, MySQL(5.5系), BootStrap, jQuery

#終わりに
参考になったかどうかわからないですがWEB未経験の自分がこの一年間でやってきたことです。
今でもわからないことたくさんですがなんとかかんとか一人称で開発できてます。
この一年間やってきてやっぱりググる力(調べる能力)をつけるのが一番大事かなぁと思いました。
特に独学でエンジニアやってる人はここが強い人が多い気がします。
後はなんだかんだで業務でやってた時が一番成長できてるので個人の勉強をずっとするよりある程度期間を定めて勉強してそれ以降は業務で経験を積んだ方がいいですね。
ilasmでstack machine その2

#概要

ilasmでstack machineやってみた。
俺言語、案を考えてみた。

#俺言語ニーモニック

|ニーモニック|意味|stackの状態|
|:--|:--|:--|
| % |stack-1,stackの剰余を求める。|１個減る|
|+|stack-1,stackの加算を求める。|１個減る|
|/|stack-1,stackの除算を求める。|１個減る|
|*|stack-1,stackの乗算を求める。|１個減る|
|-|stack-1,stackの減算を求める。|１個減る|
|pushi 100|stackに整数100を積む。|１個増える|
|push "ok"|stackに、文字列okを積む。|１個増える|
|set i|変数iにstackを入れる。|１個減る|
|get i|stackに、変数iの値を入れる。|１個増える|
|call printi|stackを数値で印字する。|１個減る|
|call prints|stackを文字列で印字する。|１個減る|
|if tugi|stack-1,stackが真ならtugiへ飛ぶ。|１個減る|
|if< tugi|stack-1,stackが大ならtugiへ飛ぶ。|１個減る|
|jp tugi|無条件でtugiへ飛ぶ。 |変化無し|

#サンプルコード

```
	pushi 	1
	set 	i
loop:
	get 	i
	pushi 	100
	if< 	bye
	get 	i
	pushi 	15
	%
	if		fizzbuzz
	get 	i
	push 	5
	%
	if		buzz
	get 	i
	push 	3
	%
	if 		fizz
	get 	i
	call 	printi
	jp 		tugi

fizzbuzz:
	push 	"fizzbuzz"
	jp 		print
buzz:
	push 	"buzz"
	jp 		print
fizz:
	push 	"fizz"

print:
	call 	prints

tugi:
	get 	i
	pushi 	1
	+
	set 	i
	jp 		loop

bye:
	ret
```

以上。
Symfonyプロジェクトで開発を進める際、気をつけていること

#はじめに
この記事は[Symfony Advent Calendar 2019](https://qiita.com/advent-calendar/2019/symfony) 25日目の記事です。

こんにちは、きゅ〜ぶです。
スタートアップで`Symfony`ベースで作られてるEC系の自社アプリケーション開発のエンジニアをやってます。
Symfony歴が2ヶ月半の若輩者ですが、一人でSymfonyを使って新規機能の開発やリファクタリングをする際、意識していることを書こうと思ってます。
あくまで個人的なやり方なのでもっといいやり方などあればご教授いただければと思います！

#前提
○画面でどういう操作をしたらその機能が実現できるかを理解している。
→要件の理解ができていること。
○あくまで自分の個人的な経験に寄る知見であること。

#Symfonyでデバッグする際は、dumpを使おう
以下公式ドキュメントを見たらだいたい使い方は載っております！
[How to Dump Debug Information in Twig Templates](https://symfony.com/doc/2.8/templating/debug.html)

自分は最近ぶっちゃけデバッグする際、`dump`より`Xdebug`を使うことが多いんですけどね・・・
一応今は、`PhpStorm`と`VirtualBox`を使用して開発しててその際、Xdebugの環境を作った時の記事を以下にまとめてあるのでこちらももしよければ参考にしてみてください。
[PHPStormでVirtualBoxのサーバーと連携してリモートデバッグ(Xdebug)の設定方法](https://qiita.com/cube_3110/items/1703bc621c680c469f4e)


#Twigの特定
まずコードを追う為のきっかけを見つけるため、画面ベースで関係する部分の洗い出しを行います。
Symfonyは、`Twig`というテンプレートエンジンを使用しています。
なので画面表示は`Twig`で行なっています。
まず登場人物として出てくる対象の`Twig`を探します。
コツは、画面に表示されている文言の中でもぱっと見少なそうな文言をプロジェクト内で検索することです。
(デベロッパーツールとかも駆使していくとよりいいです)
→検索数が少ない文言のが特定が楽にしやすい。
###Twigでのデバッグ
`{{ dump(変数名) }}`
これで変数名の中身を見ることができます。

#Controllerの特定

`Twig`が特定できたら次はどの`Controller`が動いているかを特定します。
基本的に作りとして画面遷移やボタン操作などのアクションを起こす際、`Controller`が動く形になってます。
うちは、`routing.yml`でpathとcontrollerを管理してるため、先ほどの対象の画面を表示している`Twig`の画面URLに紐付くものを探せばどこのBundleの`Controller`を使用しているかが特定できるかと思います。

###Controllerでのデバッグ

`dump(変数名)`

これで変数名の中身を見ることができます。
`Xdebug`ならブレークポイントを貼ればそこで止まるので`Controller`の先頭にブレークポイントを貼ったりします。

#####DB周りの特定

あとは大きなところで言うとDB周りの特定が鍵になってくるかと思ってます。
うちは例えば以下みたいな感じで使用しています。

```controller.php
            ->getRepository('xxxBundle:Test')
            ->createQueryBuilder('t')
            ->andWhere('t.status = :status')->setParameter('status', StatusType::START)
            ->andWhere('t.store = :store')->setParameter('store', $a->getStore())
            ->orderBy('t.orderedAt', 'ASC')
            ->getQuery()
            ->iterate();
```

`get Repository()`をしているところを探してこれだと`Test`って言うテーブルが使われていて条件として`status`がSTARTのStatusTypeのものと`store`が`$a->getStore()`でASC順で並び替えた情報を取得してます。
ここで実際phpMyAdminの方をみて対象DBを見たりしてだいたいどんな情報が入ってるかなど把握できます。

#終わりに
個人的に以下4つが分かればだいたい新しい機能実現の実装には困らないかなぁと個人的には思ってます。
・要件(やりたいこと)
・機能実現に関係する画面
・機能実現を行うController
・機能実現に関係するテーブル

拙い文章でしたが最後まで見ていただきありがとうございました！
仕事で今後も`Symfony`は触っていくのでまた知見の共有などは定期的に行っていければと思います。
[速報] [iOS] UIWebViewが使えなくなる最終期限が告知されました

この記事の続報です。
[[iOS] UIWebViewがいよいよヤバいらしい（"ITMS-90809: Deprecated API Usage"メールが届いた件）](https://qiita.com/y-some/items/1f9baeedd160f2d0fcbb)

2020年4月から、新規のApp Store申請時にUIWebView APIが含まれていると、リジェクトされる模様です。

**アップデートについては2020年12月までにUIWebViewからWKWebViewへの修正が必要です。**

ソース：
Apple Developer News and Updates
https://developer.apple.com/news/?id=12232019b

2020/5/8追記:
**2020年5月から、新規アプリにUIWebView APIが含まれていると、App Store Connectへのアップロード時にビルドが受け付けられない（ビルドを審査提出できない）です。**

2020/11/6追記:
Appleから**アップデート期限延長**のアナウンスが出ました。
[[iOS] UIWebViewを使用するアプリのアップデート期限が延長されました](https://qiita.com/y-some/items/a9733acab327ef1698f9)
ilasmでstack machine

# 概要
 
ilasmでstack machineやってみた。
fizzbuzzに、コメント付けて見た。

# サンプルコード

```
.assembly extern mscorlib {}
.assembly fizzbuzz {		//プログラム名
}
.method static void main() {
	.entrypoint
	.locals init(int32 i)	//変数の宣言
	ldc.i4 		1       //stackに1を積む
	stloc 		i       //変数iにstackの値を入れる。
loop:
	ldloc 		i		//stackに変数iの値を積む
	ldc.i4 		100
	bgt 		bye		//stack-1,stackを比べて小さいならbyeに飛ぶ。
	ldloc 		i
	ldc.i4 		15
	rem					//stack-1,stackの剰余を求める。
	brfalse 	fizzbuzz	//ゼロで無いならfizzbuzzに飛ぶ。
	ldloc 		i
	ldc.i4 		5
	rem
	brfalse 	buzz
	ldloc 		i
	ldc.i4 		3
	rem
	brfalse 	fizz
	ldloc 		i
	call 		void [mscorlib] System.Console::WriteLine(int32) //stackを印刷。
	br 			tugi	//tugiへ飛ぶ。

fizzbuzz:
	ldstr 		"fizzbuzz"   //stackに「fizzbuzz」を積む。
	br 			print
buzz:
	ldstr 		"buzz"
	br 			print
fizz:
	ldstr 		"fizz"

print:
	call 		void [mscorlib] System.Console::WriteLine(string)

tugi:
	ldloc 		i
	ldc.i4 		1
	add						//stack-1,stackの加算を求める。
	stloc 		i
	br 			loop

bye:
	ret
}


```

以上。
2019年を振り返る

これはLIGのアドベントカレンダーの最後の記事です。

2019年もあっという間に終わりですね。
LIGの2019年がどうだったのか、振り返ってみたいと思います。

これ読んでくれる人はご存知だとは思いますが、一応LIGとはWEBの制作会社です。
他にもいろんな事業はやってますが、ここではWEB制作事業にことをば。

## よかったこと
LIGは大企業では全然ないので、制度だったりルールとかがよく変わります。
他の会社の経験がないんで推測ですが、よく変わる方だと思います。
今年は制作においてはツールや環境がけっこう変わりました。
チャットツールはチャットワークからslackに変更され、スケジュール管理ツールはRedmaineからAsanaになりました。
WEBサイト制作に置ける開発環境も実は変わったし、ツール周りはよい感じに進歩していってる気がします。
使い方の整備だったり、浸透ってところはまだこれからってところもありますが、よかったことではあるかなぁと。

あとLIGでは職種毎にリーダーを置いていて、ユニットリーダーとよんでいるんですが、今年はほぼ一新されました。
ディレクタ、デザイナ、フロントエンドエンジニア、バックエンドエンジニアの4名のリーダーのうち3名が新しくリーダーになってくれた人たちです。
4分の3もリーダーが変わるって大丈夫なのって思っちゃいません？思っちゃっても不思議じゃないと思うんですが、これがねいい感じだと思っています。少なくとも私は。
ここ数年関わるメンバーが固定化されがちだったってのもあるんですが、新しい視点だったり提案をくれるし、こちらからお願いしたいこともしっかりやってくれるしで非常によかった。
Slackへの移行なども彼らのおかげで非常にスムーズでした。
感謝しております。

あとこれ組織的にはよかったことかな、たぶん。
私が新規案件を実装することが減りました、超減った。
よかったことなんだろうなぁ、もうエンジニアを名乗れなくなる日がきてしまうのかもしれない

## わるかったこと
これはもういっぱいありすぎて書ききれないくらいあるんだけど。
一番感じていることは、組織として非常に難しい規模になってきてしまったなと思っている。
今WEB制作事業が50人くらいで日本法人だと90人とかいるのかな、たぶん。
LIGはすげぇ距離が近くて、社長とかも話に行こうと思えばすぐ話せる感じの会社でずっとやってきて、ゆるい感じの距離感をもってるんですが。
でもこの規模になるとルールとかうるさく作らないとうまくいかないところもあり、こううるさいくするところと、ゆるい感じの両立というかが非常に難しいなと。

組織として整ってないとかまだまだすぎるところもたくさんあり、そこはどんどん整備はしていかなければいかんのでそこはやるしかないって感じなんですが。
もともとあったいい文化みたいなのをうまく残せるかが難しいと感じている。

あと１番悪いと思うのは私も含めてだけど、うまく権限委譲をできてない。
これを適切にやらないとボトルネック多すぎで、全然うまくいかないことばかりになる。
2020年はこれを早急に絶対解決する、もっと人を信じて任せていく感じにしたい。


あー、これとりあえず書き出したけどゴールが見えないな。
毎年課題の方ばっかり思いつくんだよね、こういう記事書こうと思うと。

課題も多いし制作してたらつらいことも多いんだけど、個人的には楽しく仕事させてもらってます。
WEB制作って意味ではずっとかわらないんだけど、楽しくできてるのは一緒に働いてくれるみんなのおかげだなぁとほんとに思っています。

なので自分だけじゃなくね、みんなも楽しく思えるような会社にもっともっとしていきたいと思います。


残り少ないですが、よいお年を
printのFILEHANDLE指定方法

以下の書き方を見たことがなくて、どういう意味になるのか調べてみた。

```perl
print {*STDERR} "Hello\n";
```

というのも、標準エラー出力に書き込むだけならbarewordで特に問題ない認識だったので。

```perl
print STDERR "Hello\n";
```

> If you're storing handles in an array or hash, or in general whenever you're using any expression more complex than a bareword handle or a plain, unsubscripted scalar variable to retrieve it, you will have to use a block returning the filehandle value instead, in which case the LIST may not be omitted
> https://perldoc.perl.org/functions/print.html

FILEHANDLEをブロックにすることで、以下のように複雑な表現も可能なんだそうで。

```perl
print { $files[$i] } "stuff\n";
print { $OK ? *STDOUT : *STDERR } "stuff\n";
```

ブロックで囲まないとダメ。サブルーチンの参照 `\&func` とかだと動かない。ブロックの中でサブルーチンを呼ぶのは問題なし。

```perl:こういうのも動く（あたりまえ）
print {&func} "Hello\n";

sub func {
    *STDERR;
}
```

条件によってファイルの出力先を変えたい場合、例えばログレベルみたいな実装をしたいときに使えるのかな。
駆け出しエンジニアにおすすめしたい Mac タイピング速度を向上させる１０の厳選キーバインド

Mac はデフォルトで Emacs キーバインドが使用できます。
ターミナルだけでなく、Chrome やメモなど、ほぼ全てのアプリケーションでこのキーバインドが使用できます。

十字キーを使用せずにカーソル移動ができるだけでも圧倒的に作業効率が上がるので
ぜひ Mac 使いには Emacs キーバインドをマスタしてほしい！

このキーバインドを使いこなすことで以下のようなメリットがあります。

- 常人の２倍以上のタイピング速度で作業ができる。
- エンジニアとして仕事できる量、時間が増える。
- スムーズにタイピングができるのでイライラしない。
- 十字キーに手を移動しなくなるので、腱鞘炎になりずらい。
- Vimmer の嫉妬心を煽る。

# カーソル移動

まずはカーソル移動からマスターしましょう。
ターミナルでは `Ctrl+p` を押すと、十字キー上を押した時と同様にヒストリーが表示できます。

| コマンド | 概要 | 覚え方                |
| -------- | ---- | --------------------- |
| Ctrl + p | 上   | previous line の p    |
| Ctrl + n | 下   | next line の n        |
| Ctrl + b | 左   | backward の b         |
| Ctrl + f | 右   | forward の f          |
| Ctrl + a | 行頭 | alphabet の最初の文字 |
| Ctrl + e | 行末 | end の e              |

![idou.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163591/cf351c63-9698-7e9a-3c82-9dc8a4bc870f.gif)

# 文字列操作

１行切り取りと貼り付けはものすごく高い頻度で使います。
「Ctrl+K Y、空気読めない」で覚えましょう。

| コマンド | 概要         | 覚え方         |
| -------- | ------------ | -------------- |
| Ctrl + d | 右を削除     | delete の d    |
| Ctrl + h | 左を削除     | hidari の h    |
| Ctrl + k | １行切り取り | kill line の k |
| Ctrl + y | 貼り付け     | yank の y      |

![ky.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163591/b8a61c35-673b-7336-8768-86080f4f7c0c.gif)

# 範囲選択

実は `shift` キーを同時に使うことで範囲選択もできます。
`shift + Ctrl + f`などを押してみましょう。続けて `Command + x, v` で切り取り、ペーストができます（Emacs 標準の `Ctrl + w` などが使えないのは残念ですが）

| コマンド         | 概要 |
| ---------------- | ---- |
| Ctrl + shift + p | 上   |
| Ctrl + shift + n | 下   |
| Ctrl + shift + b | 左   |
| Ctrl + shift + f | 右   |
| Ctrl + shift + a | 行頭 |
| Ctrl + shift + e | 行末 |

![shiftv.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163591/562acb70-55c9-d954-b7a5-1d2d88684c9a.gif)

# その他
細かいテクニックですが

`Ctrl + n` と `Ctrl + k` の組み合わせは最高です。
以下のように決まった箇所以降を切り取る作業が一瞬で終わります。

![kn.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163591/f15deb22-129b-e7ad-80b0-e79e20de8bcd.gif)


このキーバインドになれてしまうと、もう矢印キーに手を触れたくなくなります。
ぜひ Emacs キーバインドを Mac に取り入れて作業効率を飛躍させましょう！